home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / newnewrender.s < prev    next >
Text File  |  1997-11-28  |  58KB  |  4,132 lines

  1.  
  2. * the 'Hello World' program in 68000 Assembler
  3. * the C version can be found in the Intuition manual
  4.  
  5. * this source code (C) HiSoft 1992 All Rights Reserved
  6.  
  7. * for Devpac Amiga Version 2 the following symbols were changed
  8. * to avoid clashes with the new include files:
  9. * Screen->MyScreen, NewScreen->MyNewScreen
  10. * Window->MyWindow, NewWindow->MyNewWindow
  11.  
  12.     opt    c+,d+
  13.  
  14.     include    workbench:utilities/devpac/system            use pre-assembled header
  15.     include    exec/exec_lib.i
  16.     include    intuition/intuition.i
  17.     include    intuition/intuition_lib.i
  18.     include    graphics/graphics_lib.i
  19.     include    graphics/text.i
  20.  
  21. INTUITION_REV    equ    31        v1.1
  22. GRAPHICS_REV    equ    31        v1.1
  23.  
  24. * Open the intuition library
  25.  
  26.     moveq    #100,d4            default error return code
  27.  
  28.     moveq    #INTUITION_REV,d0    version
  29.     lea    int_name(pc),a1
  30.     CALLEXEC OpenLibrary
  31.     tst.l    d0
  32.     beq    exit_false        if failed then quit
  33.     move.l    d0,_IntuitionBase    else save the pointer
  34.  
  35.     moveq    #GRAPHICS_REV,d0
  36.     lea    graf_name(pc),a1
  37.     CALLEXEC OpenLibrary
  38.     tst.l    d0
  39. ;    beq    exit_closeint        if failed then close Int, exit
  40.     move.l    d0,_GfxBase
  41.     lea    MyNewScreen(pc),a0
  42.     CALLINT    OpenScreen        open a screen
  43.     tst.l    d0
  44. ;    beq    exit_closeall        if failed the close both, exit
  45.     move.l    d0,MyScreen
  46.  
  47.     move.l MyScreen,a0
  48.     lea sc_BitMap(a0),a0
  49.     lea bm_Planes(a0),a0
  50.  
  51.     
  52.     move.l #RAWSCRN,(a0)
  53.     move.l #RAWSCRN+10240,4(a0)
  54.     move.l #RAWSCRN+10240*2,8(a0)
  55.     move.l #RAWSCRN+10240*3,12(a0)
  56.     move.l #RAWSCRN+10240*4,16(a0)
  57.     move.l #RAWSCRN+10240*5,20(a0)
  58.     move.l #RAWSCRN+10240*6,24(a0)
  59.     move.l #RAWSCRN+10240*7,28(a0)
  60.  
  61. * now initialise a NewWindow structure. This is normally easier to
  62. * do with dc.w/dc.l statement etc, but for comparison with the C
  63. * version we do it like this
  64.     lea    MyNewWindow(pc),a0    good place to start
  65.     move.w    #20,nw_LeftEdge(a0)
  66.     move.w    #20,nw_TopEdge(a0)
  67.     move.w    #300,nw_Width(a0)
  68.     move.w    #100,nw_Height(a0)
  69.     move.b    #0,nw_DetailPen(a0)
  70.     move.b    #1,nw_BlockPen(a0)
  71.     move.l    #window_title,nw_Title(a0)
  72. _temp    set    WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
  73.     move.l    #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
  74.     move.l    #CLOSEWINDOW,nw_IDCMPFlags(a0)
  75.     move.w    #CUSTOMSCREEN,nw_Type(a0)
  76.     clr.l    nw_FirstGadget(a0)
  77.     clr.l    nw_CheckMark(a0)
  78.     move.l    MyScreen(pc),nw_Screen(a0)
  79.     clr.l    nw_BitMap(a0)
  80.     move.w    #100,nw_MinWidth(a0)
  81.     move.w    #25,nw_MinHeight(a0)
  82.     move.w    #640,nw_MaxWidth(a0)
  83.     move.w    #200,nw_MaxHeight(a0)
  84.  
  85. * thats it set up, now open the window (a0=NewWindow already)
  86. ;    CALLINT    OpenWindow
  87. ;    tst.l    d0
  88. ;    beq    exit_closescr            if failed
  89. ;    move.l    d0,MyWindow            save it
  90. ;
  91. ;    move.l    d0,a1                window
  92. ;    move.l    wd_RPort(a1),a1            rastport
  93. ;    moveq    #20,d0                X
  94. ;    moveq    #20,d1                Y
  95. ;    CALLGRAF Move                move the cursor
  96. ;
  97. ;    move.l    MyWindow(pc),a0
  98. ;    move.l    wd_RPort(a0),a1            rastport
  99. ;    lea    hello_message(pc),a0
  100. ;    moveq    #11,d0
  101. ;    CALLGRAF Text                print something
  102. ;
  103. ;    move.l    MyWindow(pc),a0
  104. ;    move.l    wd_UserPort(a0),a0
  105. ;    move.b    MP_SIGBIT(a0),d1        (misprint in manual)
  106. ;    moveq    #0,d0
  107. ;    bset    d1,d0                do a shift
  108. ;    CALLEXEC Wait
  109.  
  110. ;    moveq    #0,d4                return code
  111.  
  112. * various exit routines that do tidying up, given a return code in d4
  113.  
  114. ;    move.l    MyWindow(pc),a0
  115. ;    CALLINT CloseWindow
  116.  
  117. ;exit_closescr
  118. ;    move.l    MyScreen(pc),a0
  119. ;    CALLINT CloseScreen
  120.  
  121. ;exit_closeall
  122. ;    move.l    _GfxBase(pc),a1
  123. ;    CALLEXEC CloseLibrary
  124.  
  125. ;exit_closeint
  126. ;    move.l    _IntuitionBase(pc),a1
  127. ;    CALLEXEC CloseLibrary
  128.  
  129. ;done:
  130. ;    bra done
  131.  
  132.  move.l #PALETTEBIT,a0
  133.  move.l #COPIEDPAL+4,a1
  134.  move.w #255,d0
  135.  
  136. copydown:
  137.  move.b 1(a0),(a1)
  138.  move.b 3(a0),4(a1)
  139.  move.b 5(a0),8(a1)
  140.  add.w #6,a0
  141.  add.w #12,a1
  142.  dbra d0,copydown
  143.  
  144.  move.w #256,COPIEDPAL
  145.  move.w #0,COPIEDPAL+2
  146. LOOKFORME:
  147.  move.l MyScreen,a0
  148.  lea sc_ViewPort(a0),a0
  149.  move.l #COPIEDPAL,a1
  150.  move.l _GfxBase,a6
  151.  jsr -$372(a6)
  152.  
  153.  move.l MyScreen,a4
  154.  move.w sc_MouseX(a4),d0
  155.  move.w sc_MouseY(a4),d1
  156.  move.w d0,OLDXM
  157.  move.w d1,OLDYM
  158.     
  159.  move.l 4.w,a6
  160.  move.l #doslibname,a1
  161.  moveq #0,d0
  162.  jsr -552(a6)
  163.  move.l d0,doslib
  164.  
  165.  move.l doslib,a6
  166.  move.l #OBJNAME,d1
  167.  move.l #1005,d2
  168.  jsr -30(a6)
  169.  move.l d0,ROTATEDPTS
  170.  
  171.  move.l doslib,a6
  172.  move.l d0,d1
  173.  move.l #POLYGONDATA,d2
  174.  move.l #30000,d3
  175.  jsr -42(a6)
  176.  
  177.  move.l doslib,a6
  178.  move.l ROTATEDPTS,d1
  179.  jsr -36(a6)
  180.  
  181.     
  182. loop:
  183.  
  184.  move.l #POLYGONDATA,a3
  185.  move.w (a3)+,SORTIT
  186.  move.l a3,START_OF_OBJECT
  187.     
  188.  move.w (a3)+,num_points
  189.  move.w (a3)+,d6
  190.  move.w d6,num_frames
  191.  move.l a3,POINTER_TO_POINTERS
  192.  lea (a3,d6.w*4),a3
  193.  move.l a3,LinesPtr
  194.  moveq #0,d5
  195.  moveq #0,d2
  196.  
  197.  move.l POINTER_TO_POINTERS,a4
  198.  move.w (a4,d5.w*4),d2
  199.  add.l START_OF_OBJECT,d2
  200.  move.l d2,PtsPtr
  201.  move.w 2(a4,d5.w*4),d5
  202.  add.l START_OF_OBJECT,d5
  203.  move.l d5,PolyAngPtr
  204.  move.l d2,a3
  205.  move.w num_points,d5
  206.  
  207.  move.l (a3)+,OBJONOFF
  208.  
  209.  move.l a3,PointAngPtr
  210.  add.w d5,d5
  211.  move.w d5,d2
  212.  add.w d5,d5
  213.  add.w d5,d2
  214.  add.w d2,a3
  215.  move.l a3,PtsPtr
  216.  
  217.  move.l MyScreen,a4
  218.  move.w sc_MouseX(a4),d0
  219.  move.w sc_MouseY(a4),d1
  220.  
  221.  sub.w OLDXM,d0
  222.  sub.w OLDYM,d1
  223.  add.w d0,OLDXM
  224.  add.w d1,OLDYM
  225.  
  226.  btst #6,$bfe001
  227.  beq.s .SHIFTABOUT
  228.  
  229.  muls #8190,d0
  230.  divs #320,d0
  231.  add.w d0,YANG
  232.  and.w #8190,YANG
  233.  muls #8190,d1
  234.  divs #320,d1
  235.  and.w #8190,d1
  236.  add.w d1,XANG
  237.  and.w #8190,XANG
  238.  
  239. ; add.w #40,AANG
  240. ; add.w #70,BANG
  241. ; and.w #8191,AANG
  242. ; and.w #8191,BANG
  243.  
  244. ; add.w #60,CANG
  245. ; add.w #90,DANG
  246. ; and.w #8191,CANG
  247. ; and.w #8191,DANG
  248.  
  249.  
  250.  bra .ROTABOUT
  251. .SHIFTABOUT
  252.  
  253.   muls #8190,d0
  254.  divs #320,d0
  255.  add.w d0,BANG
  256.  and.w #8190,BANG
  257.  muls #8190,d1
  258.  divs #320,d1
  259.  and.w #8190,d1
  260.  add.w d1,AANG
  261.  and.w #8190,AANG
  262.  
  263.  
  264. .ROTABOUT
  265.  
  266.  move.w AANG,d1
  267.  move.w BANG,d3
  268. ; cmp.w #2,d6
  269. ; bne.s .notsecrot
  270. ; move.w CANG,d1
  271. ; move.w DANG,d3
  272. ;.notsecrot
  273.  move.l #SINETABLE,a1
  274.  move.w (a1,d1.w),XSIN    ;xsin
  275.  move.w (a1,d3.w),YSIN    ;ysin
  276.  
  277.  add.w #2048,a1
  278.  move.w (a1,d1.w),XCOS    ;xcos
  279.  move.w (a1,d3.w),YCOS    ;ycos
  280.  
  281.  move.w XANG,d1
  282.  move.w YANG,d3
  283. ; cmp.w #2,d6
  284. ; bne.s .notsecrot
  285. ; move.w CANG,d1
  286. ; move.w DANG,d3
  287. ;.notsecrot
  288.  move.l #SINETABLE,a1
  289.  move.w (a1,d1.w),XSIN2    ;xsin
  290.  move.w (a1,d3.w),YSIN2    ;ysin
  291.  
  292.  add.w #2048,a1
  293.  move.w (a1,d1.w),XCOS2    ;xcos
  294.  move.w (a1,d3.w),YCOS2    ;ycos
  295.  
  296.  
  297. ************************************************
  298. ************************************************
  299. ************************************************
  300. ************************************************
  301. ************************************************
  302. ************************************************
  303. ************************************************
  304. ************************************************
  305. ************************************************
  306. ************************************************
  307. ************************************************
  308. ************************************************
  309. ************************************************
  310. ************************************************
  311.  
  312. *SHADOW BUFFER CALCULATION
  313.  
  314.  
  315. ; First, calculate the normal brightnesses
  316. ; for points. NB: -1,-1,-1 = this point not used
  317. ; in gouraud shading.
  318.  
  319.  move.l #NORMBRIGHTS,a2
  320.  move.l PointAngPtr,a0
  321.  move.w num_points,d7
  322.  
  323.  move.l #NORMVECTS,a5
  324.  
  325.  subq #1,d7
  326.  
  327. CALCNORMBRIGHTS:
  328.  
  329.  move.w (a0)+,d0
  330.  move.w (a0)+,d1
  331.  move.w (a0)+,d2
  332.  
  333.  move.w #0,d6
  334.  
  335.  cmp.w #-1,d0
  336.  bne.s .notnot
  337.  cmp.w #-1,d1
  338.  bne.s .notnot
  339.  cmp.w #-1,d2
  340.  bne.s .notnot
  341.  
  342.  move.w #-1,x1
  343.  move.w #-1,y1
  344.  move.w #-1,z1
  345.  bra .dontbother
  346.  
  347. .notnot:
  348.  neg.w d1
  349.  
  350.  move.w d0,d3
  351.  move.w d2,d5
  352.  
  353.  muls YCOS,d0
  354.  muls YSIN,d2
  355.  sub.l d2,d0
  356.  add.l d0,d0
  357.  swap d0
  358. ; asr.l #6,d0    ; new x*512
  359.  
  360.  muls YSIN,d3
  361.  muls YCOS,d5
  362.  add.l d5,d3
  363.  add.l d3,d3
  364.  swap d3
  365.  move.w d3,d2    ; new z
  366.  
  367.  move.w d1,d4
  368.  move.w d2,d5
  369.  muls XCOS,d1
  370.  muls XSIN,d2
  371.  sub.l d2,d1
  372.  add.l d1,d1
  373.  swap d1
  374.  
  375.  muls XSIN,d4
  376.  muls XCOS,d5
  377.  add.l d5,d4
  378.  add.l d4,d4
  379.  swap d4
  380.  move.w d4,d2    ; new z
  381.  
  382.  
  383.  move.w d0,d3
  384.  move.w d2,d5
  385.  
  386.  muls YCOS2,d0
  387.  muls YSIN2,d2
  388.  sub.l d2,d0
  389.  add.l d0,d0
  390.  swap d0
  391.  
  392.  muls YSIN2,d3
  393.  muls YCOS2,d5
  394.  add.l d5,d3    
  395.  add.l d3,d3
  396.  swap d3
  397.  move.w d3,d2    ; new z
  398.  
  399.  move.w d1,d4
  400.  move.w d2,d5
  401.  muls XCOS2,d1
  402.  muls XSIN2,d2
  403.  sub.l d2,d1
  404.  add.l d1,d1
  405.  swap d1
  406.  
  407.  muls XSIN2,d4
  408.  muls XCOS2,d5
  409.  add.l d5,d4
  410.  add.l d4,d4
  411.  swap d4
  412.  
  413.  move.w d0,x1
  414.  move.w d1,y1
  415.  move.w d4,z1
  416.  
  417.  
  418.  move.w d1,d6    ; new y 
  419.  
  420.  asr.w #4,d6
  421.  add.w #20,d6
  422.  
  423.  ble.s .okokok
  424.  
  425.  moveq #0,d6
  426.  
  427. .okokok:
  428.  add.w #$1c,d6
  429.  cmp.w #1,d6
  430.  bge.s .okokokok
  431.  moveq #1,d6
  432. .okokokok:
  433.  
  434. ; add.w #64,d6
  435. ; cmp.w #28,d6
  436. ; blt.s .okbig
  437. ; move.w #28,d6
  438. ;.okbig
  439.  
  440. .dontbother:
  441.  move.w x1,(a5)+
  442.  move.w y1,(a5)+
  443.  move.w z1,(a5)+
  444.  move.w d6,(a2)+
  445.  
  446.  dbra d7,CALCNORMBRIGHTS
  447.  
  448.  
  449. ; Next, calculate the point coords for
  450. ; the shadow buffer.
  451.  
  452.  move.l #SHADOWPTS,a2
  453.  move.l PtsPtr,a0
  454.  move.w num_points,d7
  455.  subq #1,d7
  456.  
  457. ROTPTLOPSHAD:
  458.  move.w (a0)+,d0
  459.  move.w d0,d3
  460.  move.w (a0)+,d1
  461.  move.w (a0)+,d2
  462.  move.w d2,d5
  463.  
  464.  muls YCOS,d0
  465.  muls YSIN,d2
  466.  sub.l d2,d0
  467.  add.l d0,d0
  468.  swap d0
  469. ; asr.l #6,d0    ; new x*512
  470.  
  471.  muls YSIN,d3
  472.  muls YCOS,d5
  473.  add.l d5,d3
  474.  add.l d3,d3
  475.  swap d3
  476.  move.w d3,d2    ; new z
  477.  
  478.  move.w d1,d4
  479.  move.w d2,d5
  480.  muls XCOS,d1
  481.  muls XSIN,d2
  482.  sub.l d2,d1
  483.  add.l d1,d1
  484.  swap d1
  485.  
  486.  muls XSIN,d4
  487.  muls XCOS,d5
  488.  add.l d5,d4
  489.  add.l d4,d4
  490.  swap d4
  491.  move.w d4,d2    ; new z
  492.   
  493.  move.w d0,d3
  494.  move.w d2,d5
  495.  
  496.  muls YCOS2,d0
  497.  muls YSIN2,d2
  498.  sub.l d2,d0
  499.  asr.l #6,d0    ; new x*512
  500.  
  501.  muls YSIN2,d3
  502.  muls YCOS2,d5
  503.  add.l d5,d3
  504.  add.l d3,d3
  505.  swap d3
  506.  move.w d3,d2    ; new z
  507.  
  508.  move.w d1,d4
  509.  move.w d2,d5
  510.  muls XCOS2,d1
  511.  muls XSIN2,d2
  512.  sub.l d2,d1
  513.  asr.l #6,d1    ; new y*512
  514.  
  515.  muls XSIN2,d4
  516.  muls XCOS2,d5
  517.  add.l d5,d4
  518.  add.l d4,d4
  519.  swap d4
  520.  move.w d4,d2    ; new z
  521.  
  522.  ext.l d2
  523.  
  524.  move.w XOFF,d5
  525.  ext.l d5
  526.  asl.l #8,d5
  527.  add.l d5,d5
  528.  add.l d5,d0
  529.  
  530.  move.l d0,(a2)+
  531.  move.l d1,(a2)+
  532.  move.w d2,(a2)+
  533.  
  534.  dbra d7,ROTPTLOPSHAD
  535.  
  536.  
  537.  
  538. ***************************************
  539. * Calculate viewer position for specularity..
  540.  
  541.  move.w #0,d0
  542.  move.w #0,d1
  543.  move.w #-1024,d2
  544.  
  545. ; move.w d0,d3
  546. ; move.w d2,d5
  547. ;
  548. ; muls YCOS,d0
  549. ; muls YSIN,d2
  550. ; sub.l d2,d0
  551. ; add.l d0,d0
  552. ; swap d0
  553. ; asr.l #6,d0    ; new x*512
  554. ; muls YSIN,d3
  555. ; muls YCOS,d5
  556. ; add.l d5,d3
  557. ; add.l d3,d3
  558. ; swap d3
  559. ; move.w d3,d2    ; new z
  560. ;
  561. ; move.w d1,d4
  562. ; move.w d2,d5
  563. ; muls XCOS,d1
  564. ; muls XSIN,d2
  565. ; sub.l d2,d1
  566. ; add.l d1,d1
  567. ; swap d1
  568. ; muls XSIN,d4
  569. ; muls XCOS,d5
  570. ; add.l d5,d4
  571. ; add.l d4,d4
  572. ; swap d4
  573. ; move.w d4,d2    ; new z
  574.  
  575.  move.w d0,d3
  576.  move.w d2,d5
  577.  
  578.  muls YCOS2,d0
  579.  muls YSIN2,d2
  580.  sub.l d2,d0
  581.  add.l d0,d0
  582.  swap d0
  583.  
  584.  muls YSIN2,d3
  585.  muls YCOS2,d5
  586.  add.l d5,d3    
  587.  add.l d3,d3
  588.  swap d3
  589.  move.w d3,d2    ; new z
  590.  
  591.  move.w d1,d4
  592.  move.w d2,d5
  593.  muls XCOS2,d1
  594.  muls XSIN2,d2
  595.  sub.l d2,d1
  596.  add.l d1,d1
  597.  swap d1
  598. ; asr.l #6,d1    ; new y*512
  599.  
  600.  muls XSIN2,d4
  601.  muls XCOS2,d5
  602.  add.l d5,d4
  603.  add.l d4,d4
  604.  swap d4
  605.  
  606.  move.w d0,x2b
  607.  move.w d1,y2b
  608.  move.w d4,z2b
  609.  
  610. ; Now the specular highlight efforts....
  611.  
  612.  move.l #SPECBRIGHTS,a2
  613.  move.l #NORMVECTS,a1
  614.  
  615.  move.l #SHADOWPTS,a5
  616.  
  617.  move.w num_points,d7
  618.  subq #1,d7
  619.  
  620. CALCSPECBRIGHTS:
  621.  
  622.  move.w (a1)+,x1
  623.  move.w (a1)+,y1
  624.  move.w (a1)+,z1
  625.  
  626.  move.w x2b,d0
  627.  move.l (a5)+,d1
  628.  asr.l #8,d1
  629.  asr.l #1,d1
  630.  sub.w d1,d0
  631.  move.w d0,x2
  632.  move.w y2b,d0
  633.  move.l (a5)+,d1
  634.  asr.l #8,d1
  635.  asr.l #1,d1
  636.  sub.w d1,d0
  637.  move.w d0,y2
  638.  move.w z2b,d0
  639.  sub.w (a5)+,d0
  640.  move.w d0,z2
  641.  
  642.  move.w #0,d6
  643.  
  644.  cmp.w #-1,x1
  645.  bne.s .notnot
  646.  cmp.w #-1,y1
  647.  bne.s .notnot
  648.  cmp.w #-1,z1
  649.  beq .dontbother
  650. .notnot: 
  651.  
  652.  move.w x2,d2
  653.  muls d2,d2
  654.  move.w y2,d1
  655.  muls d1,d1
  656.  add.l d1,d2
  657.  move.w z2,d1
  658.  muls d1,d1
  659.  add.l d1,d2
  660.  
  661.  jsr CALCSQROOT
  662.  
  663.  move.w d2,l2
  664.  
  665.  move.w y1,d0
  666.  muls z2,d0
  667.  move.w y2,d1
  668.  muls z1,d1
  669.  sub.l d1,d0    ; x4
  670.  
  671.  move.w z1,d1
  672.  muls x2,d1
  673.  move.w z2,d2
  674.  muls x1,d2
  675.  sub.l d2,d1    ; y4
  676.  
  677.  move.w x1,d2
  678.  muls y2,d2
  679.  move.w x2,d3
  680.  muls y1,d3
  681.  sub.l d3,d2    ; z4
  682.  
  683.  asr.l #8,d0
  684.  asr.l #8,d1
  685.  asr.l #8,d2
  686.  asr.l #2,d0
  687.  asr.l #2,d1
  688.  asr.l #2,d2
  689.  
  690.  move.w x1,d3
  691.  muls d1,d3
  692.  move.w y1,d4
  693.  muls d0,d4
  694.  sub.l d4,d3
  695.  asr.l #8,d3
  696.  asr.l #1,d3
  697.  add.w z2,d3
  698.  
  699.  muls #1024,d3
  700.  divs l2,d3
  701.  
  702.  move.w d3,z3
  703.  
  704.  move.w y1,d3
  705.  muls d2,d3
  706.  move.w z1,d4
  707.  muls d1,d4
  708.  sub.l d4,d3
  709.  asr.l #8,d3
  710.  asr.l #1,d3
  711.  add.w x2,d3
  712.  muls #1024,d3
  713.  divs l2,d3
  714.  
  715.  move.w d3,x3
  716.  
  717.  move.w z1,d3
  718.  muls d0,d3
  719.  move.w x1,d4
  720.  muls d2,d4
  721.  sub.l d4,d3
  722.  asr.l #8,d3
  723.  asr.l #1,d3
  724.  add.w y2,d3
  725.  muls #1024,d3
  726.  divs l2,d3
  727.  
  728.  move.w d3,y3
  729.  
  730.  move.w z3,d3
  731.  asr.w #4,d3
  732.  add.w #128,d3
  733.  bge.s .okpp
  734.  moveq #0,d3
  735. .okpp
  736.  cmp.w #255,d3
  737.  ble.s .okppp
  738.  move.w #255,d3
  739. .okppp
  740.  
  741.  move.b d3,d6
  742.  lsl.w #8,d6
  743.  
  744.  move.w x3,d3
  745.  asr.w #4,d3
  746.  
  747.  add.w #128,d3
  748.  bge.s .okp
  749.  moveq #0,d3
  750. .okp
  751.  cmp.w #255,d3
  752.  ble.s .okpppp
  753.  move.w #255,d3
  754. .okpppp
  755.  move.b d3,d6
  756.   
  757.  tst.w y3
  758.  blt.s .okpos
  759.  
  760.  move.w x3,d1
  761.  asr.w #4,d1
  762.  move.w z3,d2
  763.  asr.w #4,d2
  764.  
  765.  muls d1,d1
  766.  muls d2,d2
  767.  add.l d1,d2
  768.  jsr CALCSQROOT
  769.  tst.w d2
  770.  beq.s .okpos
  771.  
  772.  move.w d2,d3
  773.  neg.w d3
  774.  add.w #127,d3
  775.  
  776.  move.w z3,d4
  777.  muls d3,d4
  778.  divs d2,d4
  779.  asr.w #4,d4
  780.  add.w #128,d4
  781.  move.b d4,d6
  782.  lsl.w #8,d6
  783.  
  784.  move.w x3,d4
  785.  muls d3,d4
  786.  divs d2,d4
  787.  asr.w #4,d4
  788.  add.w #128,d4
  789.  move.b d4,d6
  790.  
  791. ; neg.w y3
  792.  
  793. .okpos
  794.   
  795. ; add.w y2,d3
  796. ;
  797. ; move.w d3,d6
  798. ;
  799. ; asr.w #4,d6
  800. ; add.w #30,d6
  801. ; ble.s .okokok
  802. ; moveq #0,d6
  803. ;.okokok:
  804. ; add.w #$1c,d6
  805. ;
  806. ; cmp.w #1,d6
  807. ; bge.s .okokokok
  808. ; moveq #1,d6
  809. ;.okokokok:
  810.  
  811. ; cmp.w #28,d6
  812. ; blt.s .okbig
  813. ; move.w #28,d6
  814. ;.okbig
  815.  
  816. .dontbother:
  817.  move.w d6,(a2)+
  818.  move.w y3,(a2)+
  819.  
  820.  dbra d7,CALCSPECBRIGHTS
  821.  
  822.  
  823.  
  824.  
  825. * NOW THE POINTS FOR ON-SCREENNESS
  826.  
  827.  move.l #ROTATEDPTS,a2
  828.  move.l PtsPtr,a0
  829.  move.w num_points,d7
  830.  subq #1,d7
  831.  
  832. ROTPTLOP:
  833.  
  834.  move.w (a0)+,d0
  835.  move.w d0,d3
  836.  move.w (a0)+,d1
  837.  move.w (a0)+,d2
  838.  move.w d2,d5
  839.  
  840.  
  841.  
  842.  muls YCOS,d0
  843.  muls YSIN,d2
  844.  sub.l d2,d0
  845.  asr.l #6,d0    ; new x*512
  846.  
  847.  muls YSIN,d3
  848.  muls YCOS,d5
  849.  add.l d5,d3
  850.  add.l d3,d3
  851.  swap d3
  852.  move.w d3,d2    ; new z
  853.  
  854.  move.w d1,d4
  855.  move.w d2,d5
  856.  muls XCOS,d1
  857.  muls XSIN,d2
  858.  sub.l d2,d1
  859.  asr.l #6,d1    ; new y*512
  860.  
  861.  muls XSIN,d4
  862.  muls XCOS,d5
  863.  add.l d5,d4
  864.  add.l d4,d4
  865.  swap d4
  866.  move.w d4,d2    ; new z
  867.  
  868.  ext.l d2
  869.  
  870.  move.w XOFF,d5
  871.  ext.l d5
  872.  asl.l #8,d5
  873.  add.l d5,d5
  874.  add.l d5,d0
  875.  
  876.  move.l d0,(a2)+
  877.  move.l d1,(a2)+
  878.  move.w d2,(a2)+
  879.  
  880.  dbra d7,ROTPTLOP
  881.  
  882. ; Now convert the rotated points to the screen:
  883.  
  884.  move.l #ROTATEDPTS,a0
  885.  move.l #ONSCREENPTS,a2
  886.  move.w num_points,d7
  887.  subq #1,d7
  888. CONVERTTOSCREEN:
  889.  move.l (a0)+,d0
  890.  move.l (a0)+,d1
  891.  move.w (a0)+,d2
  892.  add.w ZOFF,d2
  893.  ext.l d2
  894.  
  895.  move.l d0,d3
  896.  asr.l #1,d3
  897.  add.l d3,d0 
  898.  move.l d1,d3
  899.  asr.l #1,d3
  900.  add.l d3,d1 
  901.  
  902.  divs d2,d0
  903.  divs d2,d1
  904.  add.w #160*4,d0
  905.  add.w #128*4,d1
  906.  move.w d0,(a2)+
  907.  move.w d1,(a2)+
  908.  dbra d7,CONVERTTOSCREEN
  909.  
  910.  move.w #254,HIGHPOLY
  911.  
  912.  move.l LinesPtr,a1
  913.  move.l #PartBuffer,a0
  914.  move.l a0,a2
  915.  move.w #15,d0
  916. clrpartbuffSHAD:
  917.  move.l #$80000001,(a2)+
  918.  move.l #$80000001,(a2)+
  919.  move.l #$80000001,(a2)+
  920.  move.l #$80000001,(a2)+
  921.  dbra d0,clrpartbuffSHAD
  922.  
  923.  move.l #SHADOWPTS,a2
  924.  move.l OBJONOFF,d5
  925.  
  926.  move.w #0,d4
  927.  tst.w SORTIT
  928.  bne.s PutInPartsSHAD
  929.  
  930.  
  931. putinunsortedSHAD:
  932.  move.w (a1)+,d7
  933.  blt doneallpartsSHAD
  934.  lsr.l #1,d5
  935.  bcs.s .yeson
  936.  addq #2,a1
  937.  bra putinunsortedSHAD
  938. .yeson:
  939.  
  940.  move.w (a1)+,d6
  941.  move.l #0,(a0)+
  942.  move.w d7,(a0)+
  943.  move.w d4,(a0)+
  944.  addq #1,d4
  945.  bra putinunsortedSHAD
  946.  
  947. PutInPartsSHAD
  948.  move.w (a1)+,d7
  949.  blt doneallpartsSHAD
  950.  
  951.  lsr.l #1,d5
  952.  bcs.s .yeson
  953.  addq #2,a1
  954.  bra PutInPartsSHAD
  955. .yeson:
  956.  
  957.  move.w (a1)+,d6
  958.  move.l 4(a2,d6.w),d0
  959.  add.l #200000,d0
  960.  
  961.  move.l #PartBuffer-8,a0
  962.  
  963. stillfrontSHAD
  964.  addq #8,a0
  965.  cmp.l (a0),d0
  966.  blt stillfrontSHAD
  967.  move.l #endparttab-8,a5
  968. domoreshiftSHAD:
  969.  move.l -8(a5),(a5)
  970.  move.l -4(a5),4(a5)
  971.  subq #8,a5
  972.  cmp.l a0,a5
  973.  bgt.s domoreshiftSHAD
  974.  
  975.  move.l d0,(a0)
  976.  move.w d7,4(a0)
  977.  move.w d4,6(a0)
  978.  addq #1,d4
  979.  bra PutInPartsSHAD
  980.  
  981. doneallpartsSHAD:
  982.  
  983.  move.l #PartBuffer,a0
  984.  
  985. PartLoopSHAD
  986.  move.l (a0)+,d7
  987.  blt nomorepartsSHAD
  988.  
  989.  move.l #SAVEHIGHS,a2
  990.  move.w 2(a0),d0
  991.  move.w HIGHPOLY,(a2,d0.w*2)
  992.  
  993.  moveq #0,d0
  994.  move.w (a0),d0
  995.  addq #4,a0
  996.  add.l START_OF_OBJECT,d0
  997.  move.l d0,a1
  998.  
  999. polylooSHAD:
  1000.  
  1001.  tst.w (a1)
  1002.  blt.s nomorepolysSHAD
  1003.  movem.l a0/a1/d7,-(a7)
  1004.  bsr doaSHADEpoly
  1005.  movem.l (a7)+,a0/a1/d7
  1006.  
  1007.  move.w (a1),d0
  1008.  lea 18(a1,d0.w*4),a1
  1009.  
  1010.  bra.s polylooSHAD
  1011. nomorepolysSHAD:
  1012.  sub.w #1,HIGHPOLY
  1013.  bra PartLoopSHAD
  1014. nomorepartsSHAD:
  1015.  
  1016. *******************************************
  1017. * Now the on-screen bit...
  1018. *******************************************
  1019.  
  1020.  move.l LinesPtr,a1
  1021.  move.l #PartBuffer,a0
  1022.  move.l a0,a2
  1023.  move.w #15,d0
  1024. clrpartbuff:
  1025.  move.l #$80000001,(a2)+
  1026.  move.l #$80000001,(a2)+
  1027.  move.l #$80000001,(a2)+
  1028.  move.l #$80000001,(a2)+
  1029.  dbra d0,clrpartbuff
  1030.  
  1031.  move.l #ROTATEDPTS,a2
  1032.  move.l OBJONOFF,d5
  1033.  
  1034.  moveq #0,d4
  1035.  
  1036.  tst.w SORTIT
  1037.  bne.s PutInParts
  1038.  
  1039. putinunsorted:
  1040.  move.w (a1)+,d7
  1041.  blt doneallparts
  1042.  lsr.l #1,d5
  1043.  bcs.s .yeson
  1044.  addq #2,a1
  1045.  bra putinunsorted
  1046. .yeson:
  1047.  
  1048.  move.w (a1)+,d6
  1049.  move.l #0,(a0)+
  1050.  move.w d7,(a0)+
  1051.  move.w d4,(a0)+
  1052.  
  1053.  addq #1,d4
  1054.  bra putinunsorted
  1055.  
  1056. PutInParts
  1057.  move.w (a1)+,d7
  1058.  blt doneallparts
  1059.  
  1060.  lsr.l #1,d5
  1061.  bcs.s .yeson
  1062.  addq #2,a1
  1063.  bra PutInParts
  1064. .yeson:
  1065.  
  1066.  move.w (a1)+,d6
  1067.  move.l (a2,d6.w),d0
  1068.  asr.l #8,d0
  1069.  asr.l #2,d0
  1070.  muls d0,d0
  1071.  move.l 4(a2,d6.w),d2
  1072.  asr.l #8,d2
  1073.  asr.l #2,d2
  1074.  muls d2,d2
  1075.  add.l d2,d0 
  1076.  move.w 8(a2,d6.w),d2
  1077.  add.w #1024,d2
  1078.  muls d2,d2
  1079.  add.l d2,d0
  1080.  
  1081.  move.l #PartBuffer-8,a0
  1082.  
  1083. stillfront
  1084.  addq #8,a0
  1085.  cmp.l (a0),d0
  1086.  blt stillfront
  1087.  move.l #endparttab-8,a5
  1088. domoreshift:
  1089.  move.l -8(a5),(a5)
  1090.  move.l -4(a5),4(a5)
  1091.  subq #8,a5
  1092.  cmp.l a0,a5
  1093.  bgt.s domoreshift
  1094.  
  1095.  move.l d0,(a0)
  1096.  move.w d7,4(a0)
  1097.  move.w d4,6(a0)
  1098.  addq #1,d4
  1099.  bra PutInParts
  1100.  
  1101. doneallparts:
  1102.  
  1103.  move.l #PartBuffer,a0
  1104.  
  1105. PartLoop
  1106.  move.l (a0)+,d7
  1107.  blt nomoreparts
  1108.  
  1109.  move.l #SAVEHIGHS,a2
  1110.  move.w 2(a0),d0
  1111.  move.w (a2,d0.w*2),HIGHPOLY
  1112.  
  1113.  moveq #0,d0
  1114.  move.w (a0),d0
  1115.  addq #4,a0
  1116.  add.l START_OF_OBJECT,d0
  1117.  move.l d0,a1
  1118.  
  1119. polyloo:
  1120.  
  1121.  tst.w (a1)
  1122.  blt.s nomorepolys
  1123.  movem.l a0/a1/d7,-(a7)
  1124.  bsr doapoly
  1125.  movem.l (a7)+,a0/a1/d7
  1126.  
  1127.  move.w (a1),d0
  1128.  lea 18(a1,d0.w*4),a1
  1129.  
  1130.  bra.s polyloo
  1131. nomorepolys:
  1132.  sub.w #1,HIGHPOLY
  1133.  bra PartLoop
  1134. nomoreparts:
  1135.  
  1136. NOPOLYS:
  1137.  
  1138. ; btst #6,$bfe001
  1139. ; beq.s .SHOWSHADOW
  1140.  
  1141.  move.l FASTBUFFER,a0
  1142.  add.l #40*320+64,a0
  1143.  move.l #RAWSCRN,a1
  1144.  add.l #40*40+8,a1
  1145.  move.l #(24)-1,d0
  1146.  move.l #175,d1
  1147.  move.w #128,d2
  1148.  move.w #16,d3
  1149.  moveq #0,d4
  1150.  moveq #0,d5
  1151.  jsr CHUNKYTOPLANAR 
  1152.  
  1153.  bra .SHOWNSCRN
  1154.  
  1155. .SHOWSHADOW
  1156.  
  1157.  move.l #SHADOWBUFFER,a0
  1158.  add.l #40*256,a0
  1159.  move.l #RAWSCRN,a1
  1160.  add.l #40*40,a1
  1161.  move.l #(256/8)-1,d0
  1162.  move.l #175,d1
  1163.  move.w #0,d2
  1164.  move.w #8,d3
  1165.  moveq #0,d4
  1166.  moveq #0,d5
  1167.  jsr CHUNKYTOPLANAR 
  1168.  
  1169. .SHOWNSCRN:
  1170.  
  1171.  move.l FASTBUFFER,a0
  1172.  move.l #NEBBIE,a1
  1173.  add.l #40*320+64,a0
  1174.  
  1175.  move.w #175,d0
  1176. clrchunk:
  1177.  move.l (a1)+,(a0)+
  1178.  move.l (a1)+,(a0)+
  1179.  move.l (a1)+,(a0)+
  1180.  move.l (a1)+,(a0)+
  1181.  move.l (a1)+,(a0)+
  1182.  move.l (a1)+,(a0)+
  1183.  move.l (a1)+,(a0)+
  1184.  move.l (a1)+,(a0)+
  1185.  move.l (a1)+,(a0)+
  1186.  move.l (a1)+,(a0)+
  1187.  move.l (a1)+,(a0)+
  1188.  move.l (a1)+,(a0)+
  1189.  move.l (a1)+,(a0)+
  1190.  move.l (a1)+,(a0)+
  1191.  move.l (a1)+,(a0)+
  1192.  move.l (a1)+,(a0)+
  1193.  move.l (a1)+,(a0)+
  1194.  move.l (a1)+,(a0)+
  1195.  move.l (a1)+,(a0)+
  1196.  move.l (a1)+,(a0)+
  1197.  move.l (a1)+,(a0)+
  1198.  move.l (a1)+,(a0)+
  1199.  move.l (a1)+,(a0)+
  1200.  move.l (a1)+,(a0)+
  1201.  move.l (a1)+,(a0)+
  1202.  move.l (a1)+,(a0)+
  1203.  move.l (a1)+,(a0)+
  1204.  move.l (a1)+,(a0)+
  1205.  move.l (a1)+,(a0)+
  1206.  move.l (a1)+,(a0)+
  1207.  move.l (a1)+,(a0)+
  1208.  move.l (a1)+,(a0)+
  1209.  move.l (a1)+,(a0)+
  1210.  move.l (a1)+,(a0)+
  1211.  move.l (a1)+,(a0)+
  1212.  move.l (a1)+,(a0)+
  1213.  move.l (a1)+,(a0)+
  1214.  move.l (a1)+,(a0)+
  1215.  move.l (a1)+,(a0)+
  1216.  move.l (a1)+,(a0)+
  1217.  move.l (a1)+,(a0)+
  1218.  move.l (a1)+,(a0)+
  1219.  move.l (a1)+,(a0)+
  1220.  move.l (a1)+,(a0)+
  1221.  move.l (a1)+,(a0)+
  1222.  move.l (a1)+,(a0)+
  1223.  move.l (a1)+,(a0)+
  1224.  move.l (a1)+,(a0)+
  1225.  add.w #(320-192),a0
  1226.  dbra d0,clrchunk
  1227.  
  1228.  move.l #SHADOWBUFFER,a0
  1229.  move.l #-1,d1
  1230.  move.l #-1,d2
  1231.  move.w #15,d0
  1232. ;clrshad:
  1233. ; move.w #15,d5
  1234. ;innner
  1235. ; move.l d2,(a0)+
  1236. ; move.l d2,(a0)+
  1237. ; move.l d2,(a0)+
  1238. ; move.l d2,(a0)+
  1239. ; move.l d1,(a0)+
  1240. ; move.l d1,(a0)+
  1241. ; move.l d1,(a0)+
  1242. ; move.l d1,(a0)+
  1243. ; move.l d2,(a0)+
  1244. ; move.l d2,(a0)+
  1245. ; move.l d2,(a0)+
  1246. ; move.l d2,(a0)+
  1247. ; move.l d1,(a0)+
  1248. ; move.l d1,(a0)+
  1249. ; move.l d1,(a0)+
  1250. ; move.l d1,(a0)+
  1251. ; move.l d2,(a0)+
  1252. ; move.l d2,(a0)+
  1253. ; move.l d2,(a0)+
  1254. ; move.l d2,(a0)+
  1255. ; move.l d1,(a0)+
  1256. ; move.l d1,(a0)+
  1257. ; move.l d1,(a0)+
  1258. ; move.l d1,(a0)+
  1259. ; move.l d2,(a0)+
  1260. ; move.l d2,(a0)+
  1261. ; move.l d2,(a0)+
  1262. ; move.l d2,(a0)+
  1263. ; move.l d1,(a0)+
  1264. ; move.l d1,(a0)+
  1265. ; move.l d1,(a0)+
  1266. ; move.l d1,(a0)+
  1267. ; move.l d2,(a0)+
  1268. ; move.l d2,(a0)+
  1269. ; move.l d2,(a0)+
  1270. ; move.l d2,(a0)+
  1271. ; move.l d1,(a0)+
  1272. ; move.l d1,(a0)+
  1273. ; move.l d1,(a0)+
  1274. ; move.l d1,(a0)+
  1275. ; move.l d2,(a0)+
  1276. ; move.l d2,(a0)+
  1277. ; move.l d2,(a0)+
  1278. ; move.l d2,(a0)+
  1279. ; move.l d1,(a0)+
  1280. ; move.l d1,(a0)+
  1281. ; move.l d1,(a0)+
  1282. ; move.l d1,(a0)+
  1283. ; move.l d2,(a0)+
  1284. ; move.l d2,(a0)+
  1285. ; move.l d2,(a0)+
  1286. ; move.l d2,(a0)+
  1287. ; move.l d1,(a0)+
  1288. ; move.l d1,(a0)+
  1289. ; move.l d1,(a0)+
  1290. ; move.l d1,(a0)+
  1291. ; move.l d2,(a0)+
  1292. ; move.l d2,(a0)+
  1293. ; move.l d2,(a0)+
  1294. ; move.l d2,(a0)+
  1295. ; move.l d1,(a0)+
  1296. ; move.l d1,(a0)+
  1297. ; move.l d1,(a0)+
  1298. ; move.l d1,(a0)+
  1299. ; dbra d5,innner
  1300. ; exg d1,d2
  1301. ;
  1302. ; dbra d0,clrshad
  1303.  
  1304.  
  1305.  
  1306.     btst #7,$bfe001
  1307.     beq.s exit_closescr
  1308.  
  1309.  
  1310.     add.l #$8000,lmxoff
  1311.     cmp.l #40*65536,lmxoff
  1312.     blt.s .oksm
  1313.     sub.l #40*65536,lmxoff    
  1314. .oksm
  1315.  
  1316.     bra loop
  1317.     
  1318. lmxoff: dc.l 0
  1319.  
  1320. exit_closescr
  1321.     move.l    MyScreen(pc),a0
  1322.     CALLINT CloseScreen
  1323.  
  1324. exit_closeall
  1325.     move.l    _GfxBase(pc),a1
  1326.     CALLEXEC CloseLibrary
  1327.  
  1328. exit_closeint
  1329.     move.l    _IntuitionBase(pc),a1
  1330.     CALLEXEC CloseLibrary
  1331.  
  1332. exit_false
  1333.     move.l    #0,d0                return code
  1334.     rts
  1335.  
  1336. TESTTAB: ds.w 30
  1337.  
  1338. ************************************************
  1339. * SUBROUTINES HERE. ****************************
  1340. ************************************************
  1341.  
  1342.  
  1343. **********************************************************
  1344.  
  1345. * the definition of the screen - note that in assembler you
  1346. * MUST get the sizes of these fields correct, by consulting either
  1347. * the RKM or the header files
  1348.  
  1349.  
  1350. MyNewScreen    dc.w    0,0        left, top
  1351.         dc.w    320,256        width, height
  1352.         dc.w    8        depth
  1353.         dc.b    0,1        pens
  1354.         dc.w    0        viewmodes
  1355.         dc.w    CUSTOMSCREEN    type
  1356.         dc.l    MyFont        font
  1357.         dc.l    screen_title    title
  1358.         dc.l    0        gadgets
  1359.         dc.l    0        bitmap
  1360.  
  1361. * my font definition
  1362. MyFont    dc.l    font_name
  1363.     dc.w    TOPAZ_SIXTY
  1364.     dc.b    FS_NORMAL
  1365.     dc.b    FPF_ROMFONT
  1366.  
  1367. * the variables
  1368. _IntuitionBase    dc.l    0        Intuition lib pointer
  1369. _GfxBase    dc.l    0        graphics lib pointer
  1370. MyScreen        dc.l    0
  1371. MyWindow        dc.l    0
  1372. MyNewWindow    ds.b    nw_SIZE        a buffer
  1373.  
  1374.  
  1375. * some strings
  1376. int_name    INTNAME
  1377. graf_name    GRAFNAME
  1378. hello_message    dc.b    'Hello World'
  1379.  
  1380. * these are C strings, so have to be null terminated
  1381. screen_title    dc.b    'My Own Screen',0
  1382. font_name    dc.b    'topaz.font',0
  1383. window_title    dc.b    'A Simple Window',0
  1384.  
  1385.  even
  1386.  
  1387.  
  1388. doaSHADEpoly:
  1389.  
  1390.  move.w (a1)+,d7    ; sides to draw
  1391.  addq #2,a1        ; avoid holes
  1392.  
  1393.  move.l #SHADOWPTS,a3
  1394.  
  1395.  move.w (a1),d0
  1396.  move.w 4(a1),d1
  1397.  move.w 8(a1),d2
  1398.  muls #10,d0
  1399.  muls #10,d1
  1400.  muls #10,d2
  1401.  move.w 8(a3,d0.w),d3
  1402.  move.w 8(a3,d1.w),d4
  1403.  move.w 8(a3,d2.w),d5
  1404.  move.l (a3,d0.w),d0
  1405.  move.l (a3,d1.w),d1
  1406.  move.l (a3,d2.w),d2
  1407.  asr.l #8,d0
  1408.  asr.l #8,d1
  1409.  asr.l #8,d2
  1410.  asr.l #1,d0
  1411.  asr.l #1,d1
  1412.  asr.l #1,d2
  1413.  
  1414.  sub.w d1,d0
  1415.  sub.w d1,d2
  1416.  sub.w d4,d3
  1417.  sub.w d4,d5
  1418.  muls d3,d2
  1419.  muls d5,d0
  1420.  sub.l d0,d2
  1421.  bge SHADpolybehind
  1422.  
  1423.  
  1424.  
  1425.  move.w #20000,d4    ; top
  1426.  move.w #-20000,d5    ; bottom
  1427.  move.l #UVCOORDS,a4
  1428.  
  1429. putinlinesSHAD:
  1430.  move.w (a1),d0
  1431.  move.w 4(a1),d1
  1432.  
  1433.  moveq #0,d2
  1434.  move.b 2(a1),d2    ; one end U
  1435.  move.w d2,2(a4,d0.w*4)
  1436.  move.b 3(a1),d2    ; one end V
  1437.  move.w d2,(a4,d0.w*4)
  1438.  move.b 6(a1),d2    ; two end U
  1439.  move.w d2,2(a4,d1.w*4)
  1440.  move.b 7(a1),d2    ; two end V
  1441.  move.w d2,(a4,d1.w*4)
  1442.  
  1443.  move.w d0,d2
  1444.  muls #10,d2
  1445.  move.w 8(a3,d2.w),d2    ; Z
  1446.  
  1447.  cmp.w d2,d4
  1448.  ble.s .oktop
  1449.  move.w d2,d4
  1450. .oktop
  1451.  cmp.w d2,d5
  1452.  bge.s .okbot
  1453.  move.w d2,d5
  1454. .okbot
  1455.  
  1456.  movem.l d4/d5/d7/a1/a3/a4,-(a7)
  1457.  bsr SIMPLESHADLINE
  1458.  movem.l (a7)+,d4/d5/d7/a1/a3/a4
  1459.  addq #4,a1
  1460.  dbra d7,putinlinesSHAD
  1461.  addq #4,a1
  1462.   
  1463.  move.w (a1)+,TEXTUREADD
  1464.  
  1465.  asr.w #2,d4
  1466.  asr.w #2,d5
  1467.  add.w #128,d4
  1468.  add.w #128,d5
  1469.  move.w d4,TOPLINE
  1470.  move.w d5,BOTLINE
  1471.  
  1472. * Now draw the shadow polygon....
  1473.  
  1474.  move.l #SHADOWBUFFER,a2
  1475.  move.l #LEFTUVS,a0
  1476.  move.w TOPLINE,d0
  1477.  move.w BOTLINE,d1
  1478.  sub.w d0,d1
  1479.  asl.w #3,d0
  1480.  add.w d0,a0
  1481.  muls #(512/8),d0
  1482.  add.l d0,a2    ; pointer to screen line.
  1483.  
  1484.  subq #1,d1
  1485.  blt NOPOLYGONSHAD
  1486.  
  1487. DOAHORLINESHAD:
  1488.  swap d1
  1489.  
  1490.  move.w RIGHTUVS-LEFTUVS(a0),d0
  1491.  move.w (a0)+,d7
  1492.  sub.w d7,d0
  1493.  blt NOPOLYGONSHAD
  1494.  
  1495.  move.l a2,-(a7)
  1496.  
  1497. ; asr.w #2,d0
  1498. ; asr.w #2,d7
  1499.  lea (a2,d7.w*2),a2
  1500.  ext.l d0
  1501.  addq #1,d0
  1502.  
  1503.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1504.  move.w (a0)+,d4
  1505.  swap d7
  1506.  clr.w d7
  1507.  swap d4
  1508.  clr.w d4
  1509.  sub.l d4,d7
  1510.  divs.l d0,d7
  1511.  move.l d7,a5
  1512.  
  1513.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1514.  swap d7
  1515.  clr.w d7
  1516.  move.w (a0)+,d5
  1517.  swap d5
  1518.  clr.w d5
  1519.  sub.l d5,d7
  1520.  divs.l d0,d7
  1521.  move.l d7,a6
  1522.  
  1523.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1524.  swap d7
  1525.  clr.w d7
  1526.  move.w (a0)+,d6
  1527.  swap d6
  1528.  clr.w d6
  1529.  sub.l d6,d7
  1530.  divs.l d0,d7
  1531.  move.l d7,a3
  1532.  
  1533.  move.l a0,-(a7)
  1534.  move.l d1,-(a7)
  1535.  move.l #TEXTURES,a0
  1536.  move.w TEXTUREADD,d7
  1537.  bge.s .okaddtes3
  1538.  and.w #$7fff,d7
  1539.  add.l #65536*4,a0
  1540. .okaddtes3:
  1541.  ext.l d7
  1542. ; add.l d7,d7
  1543.  asl.l #8,d7
  1544.  add.l d7,a0
  1545.  move.w #0,d7
  1546.  
  1547.  subq #1,d0
  1548.  
  1549. ; d0=xdist
  1550. ; d4=U  a5=DU
  1551. ; d5=V  a6=DV
  1552. ; d6=Y  a3=DY
  1553.  moveq #0,d1
  1554.  
  1555.  swap d6
  1556.  
  1557. PLOTADOT:
  1558.  
  1559. .across
  1560.  
  1561. ; swap d4
  1562. ; swap d5
  1563. ; move.w d4,d2
  1564. ; lsl.w #8,d2
  1565. ; swap d4
  1566. ; move.b d5,d2
  1567. ; add.l a5,d4
  1568. ; swap d5
  1569. ; add.l a6,d5
  1570.  
  1571.  
  1572. ; swap d6
  1573. ; move.b (a2)+,d1
  1574. ; tst.b 1(a0,d2.w*8)
  1575. ; beq.s .noplottt
  1576.  move.b d6,(a2)
  1577.  addq #2,a2
  1578.  
  1579.  dbra d0,.across
  1580.  bra.s .plaster
  1581.  
  1582. .noplottt:
  1583.  addq #1,a2
  1584.  dbra d0,.across
  1585.  
  1586. .plaster:
  1587.  
  1588.  move.l (a7)+,d1
  1589.  move.l (a7)+,a0
  1590.  move.l (a7)+,a2
  1591.  
  1592. .noline:
  1593.  add.w #512,a2
  1594.  
  1595.  swap d1
  1596.  dbra d1,DOAHORLINESHAD
  1597.  
  1598. NOPOLYGONSHAD:
  1599.  
  1600. SHADpolybehind:
  1601.  rts
  1602.  
  1603.  
  1604. ************************************************
  1605.  
  1606. LU: dc.w 0
  1607. LV: dc.w 0
  1608. RU: dc.w 0
  1609. RV: dc.w 0
  1610.     
  1611. SIMPLESHADLINE:
  1612.  move.l #SHADOWPTS,a1
  1613.  
  1614.  move.l #UVCOORDS,a2
  1615.  move.w (a2,d0.w*4),LU
  1616.  move.w 2(a2,d0.w*4),LV
  1617.  move.w (a2,d1.w*4),RU
  1618.  move.w 2(a2,d1.w*4),RV
  1619.  
  1620.  muls #10,d0
  1621.  muls #10,d1
  1622.  move.w 8(a1,d0.w),d2        ;fz
  1623.  move.w 8(a1,d1.w),d7        ;sz
  1624.  ext.l d2
  1625.  ext.l d7
  1626.  
  1627.  move.l #LEFTUVS,a3
  1628.  asr.l #2,d2
  1629.  asr.l #2,d7
  1630.  cmp.l d2,d7 
  1631.  beq .noline
  1632.  
  1633.  bgt.s .lineonright
  1634. .lineonleft:
  1635.  move.l #RIGHTUVS,a3
  1636.  exg d0,d1
  1637.  exg d2,d7
  1638.  
  1639.  move.l LU,d5
  1640.  move.l RU,LU
  1641.  move.l d5,RU
  1642.  
  1643. .lineonright:
  1644.  
  1645.  sub.w d2,d7
  1646.  add.w #128,d2
  1647.  lea (a3,d2.w*8),a3
  1648.  
  1649.  move.w d7,YDIFF
  1650.  
  1651.  move.l (a1,d0.w),d3        ;fx
  1652.  move.l (a1,d1.w),d7        ;sx
  1653.  
  1654.  asl.l #5,d3
  1655.  asl.l #5,d7
  1656.  
  1657.  sub.l d3,d7
  1658.  divs.l YDIFF-2,d7
  1659.  move.l d7,a0    ; dx
  1660.  
  1661.  move.l #ROTATEDPTS,a1
  1662.  
  1663.  move.w LU,d4
  1664.  move.w LV,d5
  1665.  move.w RU,d6
  1666.  move.w RV,d7
  1667.  
  1668.  sub.w d4,d6
  1669.  sub.w d5,d7
  1670.  swap d4
  1671.  swap d5
  1672.  clr.w d4
  1673.  clr.w d5
  1674.  swap d6
  1675.  swap d7
  1676.  clr.w d6
  1677.  clr.w d7
  1678.  
  1679.  divs.l YDIFF-2,d6
  1680.  divs.l YDIFF-2,d7
  1681.  
  1682.  move.l d6,a4
  1683.  move.l d7,a5
  1684.  
  1685. ; asl.w #4,d0
  1686. ; asl.w #4,d1
  1687.  
  1688.  move.l 4(a1,d0.w),d6
  1689.  move.l 4(a1,d1.w),d7
  1690.  asl.l #5,d6
  1691.  asl.l #5,d7
  1692.  sub.l d6,d7
  1693.  divs.l YDIFF-2,d7
  1694.  exg d7,a6
  1695.  exg d7,d6
  1696.  
  1697.  move.l YDIFF-2,d1
  1698.  subq #1,d1
  1699.  
  1700. ; d3=x a0=dx
  1701. ; d4=u a4=du
  1702. ; d5=v a5=dv
  1703. ; d7=y a6=dy
  1704. ; d1=dz
  1705.  
  1706.  move.w HIGHPOLY,d7
  1707.  
  1708.  add.l #128*65536,d3
  1709. ; add.l #128*65536,d7
  1710.  
  1711. .PUTINLINE:
  1712.  swap d3
  1713.  move.w d3,(a3)+
  1714.  swap d3
  1715.  add.l a0,d3
  1716.  swap d4
  1717.  move.w d4,(a3)+
  1718.  swap d4
  1719.  swap d5
  1720.  add.l a4,d4
  1721.  move.w d5,(a3)+
  1722.  swap d5
  1723.  add.l a5,d5
  1724. ; swap d7
  1725.  move.w d7,(a3)+
  1726. ; swap d7
  1727. ; add.l a6,d7
  1728.  dbra d1,.PUTINLINE
  1729.  
  1730. .noline:
  1731.  rts
  1732.  
  1733. BCOS: dc.w 0
  1734. BSIN: dc.w 0
  1735. ACOS: dc.w 0
  1736. ASIN: dc.w 0
  1737. FSX: dc.w 0
  1738. FSY: dc.w 0
  1739. SSX: dc.w 0
  1740. SSY: dc.w 0
  1741.  
  1742. **************************************************
  1743.  
  1744. doapoly:
  1745.  
  1746.  move.w (a1)+,d7    ; sides to draw
  1747.  addq #2,a1        ; avoid holes
  1748.  move.w 12(a1,d7.w*4),pregour
  1749.  
  1750.  move.l #ONSCREENPTS,a3
  1751.  
  1752.  move.w (a1),d0
  1753.  move.w 4(a1),d1
  1754.  move.w 8(a1),d2
  1755.  move.w 2(a3,d0.w*4),d3
  1756.  move.w 2(a3,d1.w*4),d4
  1757.  move.w 2(a3,d2.w*4),d5
  1758.  move.w (a3,d0.w*4),d0
  1759.  move.w (a3,d1.w*4),d1
  1760.  move.w (a3,d2.w*4),d2
  1761.  
  1762.  sub.w d1,d0
  1763.  sub.w d1,d2
  1764.  sub.w d4,d3
  1765.  sub.w d4,d5
  1766.  muls d3,d2
  1767.  muls d5,d0
  1768.  sub.l d0,d2
  1769.  ble polybehind
  1770.  
  1771. ; Now we must rotate the polygons coordinates in
  1772. ; the specular map so that the texturemap is vertical
  1773. ; relative to the specular map and so that bump-
  1774. ; mapping can take place unerroneously!
  1775.  
  1776. ; movem.l d0-d7/a0-a6,-(a7)
  1777.  
  1778.  move.w #0,BCOS
  1779.  move.w #128*128,ACOS
  1780.  move.w #0,BSIN
  1781.  move.w #0,ASIN
  1782.  
  1783. ; bra .NOROT
  1784.  
  1785. ; First calculate angle B
  1786.  
  1787.  move.l #SPECBRIGHTS,a3
  1788.  
  1789.  move.w (a1),d0
  1790.  moveq #0,d5
  1791.  moveq #0,d6
  1792.  move.b (a3,d0.w*4),d5
  1793.  move.b 1(a3,d0.w*4),d6
  1794.  move.w 4(a1),d0
  1795.  moveq #0,d3
  1796.  moveq #0,d4
  1797.  move.b (a3,d0.w*4),d3
  1798.  move.b 1(a3,d0.w*4),d4
  1799.  sub.w d5,d3
  1800.  sub.w d6,d4
  1801.  
  1802.  move.w d3,d1
  1803.  move.w d4,d2
  1804.  muls d1,d1
  1805.  muls d2,d2
  1806.  add.l d1,d2
  1807.  jsr CALCSQROOT
  1808.  tst.w d2
  1809.  beq .NOROT
  1810.  
  1811.  ext.l d3
  1812.  asl.l #7,d3
  1813.  ext.l d4
  1814.  asl.l #7,d4
  1815.  divs d2,d3
  1816.  divs d2,d4
  1817.  move.w d3,BCOS
  1818.  neg.w d4
  1819.  move.w d4,BSIN
  1820.  
  1821.  moveq #0,d3
  1822.  move.b 2(a1),d3
  1823.  moveq #0,d4
  1824.  move.b 3(a1),d4
  1825.  moveq #0,d5
  1826.  move.b 2+4(a1),d5
  1827.  moveq #0,d6
  1828.  move.b 3+4(a1),d6
  1829.  
  1830.  sub.w d3,d5
  1831.  sub.w d4,d6
  1832.  
  1833.  move.w d5,d1
  1834.  move.w d6,d2
  1835.  muls d1,d1
  1836.  muls d2,d2
  1837.  add.l d1,d2
  1838.  jsr CALCSQROOT
  1839.  tst.w d2
  1840.  beq.s .NOROT
  1841.  
  1842.  ext.l d5
  1843.  ext.l d6
  1844.  asl.l #7,d5
  1845.  asl.l #7,d6
  1846.  divs d2,d5
  1847.  divs d2,d6
  1848.  move.w d5,ACOS
  1849.  neg.w d6
  1850.  move.w d6,ASIN
  1851.  
  1852.  move.w ACOS,d4
  1853.  move.w ASIN,d5
  1854.  move.w d4,d2
  1855.  move.w d5,d3
  1856.  muls BCOS,d2
  1857.  muls BSIN,d3
  1858.  sub.l d3,d2
  1859.  muls BSIN,d4
  1860.  muls BCOS,d5
  1861.  add.l d5,d4
  1862.  move.w d2,ACOS
  1863.  move.w d4,ASIN
  1864.  
  1865. .NOROT:
  1866. ; movem.l (a7)+,d0-d7/a0-a6
  1867.  
  1868.  move.l #ONSCREENPTS,a3
  1869.  
  1870.  move.w #20000,d4    ; top
  1871.  move.w #-20000,d5    ; bottom
  1872.  move.l #UVCOORDS,a4
  1873.  
  1874.  move.l a1,a0
  1875.  
  1876. putinlines:
  1877.  move.w (a1),d0
  1878.  move.w 4(a1),d1
  1879.  
  1880.  moveq #0,d2
  1881.  move.b 2(a1),d2    ; one end U
  1882.  move.w d2,2(a4,d0.w*4)
  1883.  move.b 3(a1),d2    ; one end V
  1884.  move.w d2,(a4,d0.w*4)
  1885.  move.b 6(a1),d2    ; two end U
  1886.  move.w d2,2(a4,d1.w*4)
  1887.  move.b 7(a1),d2    ; two end V
  1888.  move.w d2,(a4,d1.w*4)
  1889.  
  1890.  move.w 2(a3,d0.w*4),d2    ; Z
  1891.  
  1892.  cmp.w d2,d4
  1893.  ble.s .oktop
  1894.  move.w d2,d4
  1895. .oktop
  1896.  cmp.w d2,d5
  1897.  bge.s .okbot
  1898.  move.w d2,d5
  1899. .okbot
  1900.  
  1901.  movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
  1902.  jsr SIMPLECALCLINE
  1903.  movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
  1904.  addq #4,a1
  1905.  dbra d7,putinlines
  1906.  addq #4,a1 
  1907.  
  1908.  move.w (a1)+,TEXTUREADD
  1909.  
  1910.  asr.w #2,d4
  1911.  asr.w #2,d5
  1912. ; add.w #128,d4
  1913. ; add.w #128,d5
  1914.  move.w d4,TOPLINE
  1915.  move.w d5,BOTLINE
  1916.   
  1917.  move.l #SHADOWPTS,a1
  1918.  move.w (a0),d0
  1919.  move.w 4(a0),d1
  1920.  move.w 8(a0),d2
  1921.  
  1922. CHECKVALS:
  1923.  
  1924.  muls #10,d0
  1925.  muls #10,d1
  1926.  muls #10,d2
  1927.  
  1928.  lea (a1,d0.w),a0
  1929.  lea (a1,d2.w),a2
  1930.  lea (a1,d1.w),a1
  1931.  
  1932.  move.l (a0),d3
  1933.  sub.l (a1),d3
  1934.  asr.l #8,d3
  1935.  asr.l #1,d3
  1936.  move.l 4(a0),d4
  1937.  sub.l 4(a1),d4
  1938.  asr.l #8,d4
  1939.  asr.l #1,d4
  1940.  move.w 8(a0),d5
  1941.  sub.w 8(a1),d5
  1942.  
  1943.  move.w d3,d6
  1944.  muls d6,d6
  1945.  move.w d4,d7
  1946.  muls d7,d7
  1947.  add.l d7,d6
  1948.  move.w d5,d7
  1949.  muls d7,d7
  1950.  add.l d7,d6
  1951.  move.l d6,d2
  1952.  jsr CALCSQROOT
  1953.  move.w d2,LEN1
  1954.  
  1955.  move.l (a2),d0
  1956.  sub.l (a1),d0
  1957.  asr.l #8,d0
  1958.  asr.l #1,d0
  1959.  move.l 4(a2),d1
  1960.  sub.l 4(a1),d1
  1961.  asr.l #8,d1
  1962.  asr.l #1,d1
  1963.  move.w 8(a2),d2
  1964.  sub.w 8(a1),d2
  1965.  
  1966.  muls d2,d3
  1967.  muls d0,d5
  1968.  sub.l d3,d5    ; length
  1969.  muls.l #$4c,d5
  1970.  
  1971.  muls d0,d0
  1972.  muls d1,d1
  1973.  muls d2,d2
  1974.  add.l d0,d1
  1975.  add.l d1,d2
  1976.  jsr CALCSQROOT
  1977.  
  1978.  muls LEN1,d2
  1979.  bgt.s .ok
  1980.  moveq #1,d2
  1981. .ok
  1982.  
  1983.  divs.l d2,d5
  1984.  
  1985.  add.l #16,d5
  1986.  
  1987.  tst.l d5
  1988.  ble.s .okbr
  1989.  moveq #0,d5
  1990. .okbr:
  1991.  add.w #$5c,d5
  1992.  bge.s .okbr2
  1993.  moveq #0,d5
  1994. .okbr2:
  1995.  
  1996.  move.w d5,d0
  1997.  
  1998.  asl.w #8,d5
  1999.  move.w d5,BRIGHTNESS+2
  2000.  
  2001.  sub.w #$5c,d0
  2002.  asr.w #1,d0
  2003.  add.w #$5c,d0
  2004.  asl.w #8,d0
  2005.  move.w d0,BRIGHTNESS
  2006.  
  2007.  
  2008. ***********************************************
  2009. * Draw the polygon (shadowed).
  2010.  
  2011.  move.l FASTBUFFER,a2
  2012.  move.l #LEFTUVS,a0
  2013.  move.w TOPLINE,d0
  2014.  move.w BOTLINE,d1
  2015.  sub.w d0,d1
  2016.  asl.w #4,d0
  2017.  add.w d0,a0
  2018.  muls #(320/16),d0
  2019.  add.l d0,a2    ; pointer to screen line.
  2020.  
  2021.  subq #1,d1
  2022.  blt NOPOLYGON
  2023.  
  2024.  tst.b Gouraud
  2025.  bne GOURPOLY
  2026.  
  2027. DOAHORLINE:
  2028.  swap d1
  2029.  
  2030.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2031.  move.w (a0)+,d7
  2032.  asr.w #2,d0
  2033.  asr.w #2,d7
  2034.  sub.w d7,d0
  2035.  bge.s .okflibble
  2036.  
  2037.  add.w #14,a0
  2038.  add.w #320,a2
  2039.  swap d1
  2040.  dbra d1,DOAHORLINE
  2041.  bra NOPOLYGON
  2042.  
  2043. .okflibble:
  2044.  
  2045.  move.l a2,-(a7)
  2046.  
  2047.  add.w d7,a2
  2048.  ext.l d0
  2049.  addq #1,d0
  2050.  
  2051.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2052.  move.l (a0)+,d2 
  2053.  sub.l d2,d7
  2054.  divs.l d0,d7
  2055.  move.l d7,a1
  2056.  
  2057.  
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  move.l RIGHTUVS-LEFTUVS(a0),d7 
  2075.  move.l (a0)+,d3 
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  sub.l d3,d7
  2097.  divs.l d0,d7
  2098.  move.l d7,a4
  2099.  
  2100.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2101.  move.w (a0)+,d4
  2102.  swap d7
  2103.  clr.w d7
  2104.  swap d4
  2105.  clr.w d4
  2106.  sub.l d4,d7
  2107.  divs.l d0,d7
  2108.  move.l d7,a5
  2109.  
  2110.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2111.  swap d7
  2112.  clr.w d7
  2113.  move.w (a0)+,d5
  2114.  swap d5
  2115.  clr.w d5
  2116.  sub.l d5,d7
  2117.  divs.l d0,d7
  2118.  move.l d7,a6
  2119.  
  2120.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2121.  swap d7
  2122.  clr.w d7
  2123.  move.w (a0)+,d6
  2124.  swap d6
  2125.  clr.w d6
  2126.  sub.l d6,d7
  2127.  divs.l d0,d7
  2128.  move.l d7,a3
  2129.  
  2130.  move.l a0,-(a7)
  2131.  move.l d1,-(a7)
  2132.  move.l #TEXTURES,a0
  2133.  move.w TEXTUREADD,d7
  2134.  bge.s .okaddtes3
  2135.  and.w #$7fff,d7
  2136.  add.l #65536*4,a0
  2137. .okaddtes3:
  2138.  ext.l d7
  2139. ; add.l d7,d7
  2140.  asl.l #8,d7
  2141.  add.l d7,a0
  2142.  move.w #0,d7
  2143.  
  2144.  move.l BRIGHTNESS,a6
  2145.  
  2146.  move.l a7,SAVESTACK
  2147.  move.l #SHADOWBUFFER,a7
  2148.  
  2149.  subq #1,d0
  2150.  
  2151. ; d0=xdist
  2152. ; d2=U    a1=DU
  2153. ; d3=V  a4=DV
  2154. ; d4=X  a5=DX
  2155. ; d5=Y  a6=DY
  2156. ; d6=Z  a3=DZ
  2157.  move.w HIGHPOLY,d5
  2158.  
  2159.  moveq #0,d1
  2160.  swap d6
  2161.  move.w d6,d1
  2162.  lsl.w #8,d1
  2163.  swap d4
  2164.  move.b d4,d1
  2165.  swap d4
  2166.  swap d6
  2167.  
  2168.  moveq #0,d7
  2169.  move.b (a7,d1.l),d7
  2170.  cmp.w d7,d5
  2171.  ble INTHELIGHT
  2172.  bra.s INTHEDARK
  2173.  
  2174. PENUMBRA:
  2175.  moveq #0,d1
  2176.  swap d6
  2177.  move.w d6,d1
  2178.  lsl.w #8,d1
  2179.  swap d4
  2180.  move.b d4,d1
  2181.  swap d4
  2182.  swap d6
  2183.  add.l a5,d4
  2184.  add.l a3,d6
  2185.  
  2186.      moveq #0,d7
  2187.  move.b (a7,d1.l),d7
  2188.  cmp.w d7,d5
  2189.  ble INTOLIGHT
  2190.  bra.s INTODARK
  2191.  
  2192.  
  2193. INTHEDARK:
  2194.  moveq #0,d1
  2195.  swap d6
  2196.  move.w d6,d1
  2197.  lsl.w #8,d1
  2198.  swap d4
  2199.  move.b d4,d1
  2200.  swap d4
  2201.  swap d6
  2202.  add.l a5,d4
  2203.  add.l a3,d6
  2204.  
  2205.  moveq #0,d7
  2206.  move.b (a7,d1.l),d7
  2207.  cmp.w d7,d5
  2208.  ble.s INTOPENUM
  2209. INTODARK:
  2210.  move.w #$5c00,d7
  2211.  swap d2
  2212.  move.w d2,d1
  2213.  asl.w #8,d1
  2214.  swap d3
  2215.  move.b d3,d1
  2216.  swap d2
  2217.  swap d3
  2218.  add.l a1,d2
  2219.  add.l a4,d3
  2220.  
  2221. ; move.b (a0,d1.w*4),d7
  2222. ; beq.s .noplottt
  2223.  
  2224.  move.b TEXTUREPAL-256(pc,d7.w),(a2)+
  2225.  dbra d0,INTHEDARK
  2226.  bra.s PASTAC 
  2227.  
  2228. .noplottt
  2229.  addq #1,a2
  2230.  dbra d0,INTHEDARK
  2231.  bra.s PASTAC
  2232.  
  2233. INTOPENUM:
  2234.  move.l a6,d7
  2235.  swap d7
  2236.  swap d2
  2237.  move.w d2,d1
  2238.  asl.w #8,d1
  2239.  swap d3
  2240.  move.b d3,d1
  2241.  swap d2
  2242.  swap d3
  2243.  add.l a1,d2
  2244.  add.l a4,d3
  2245.  
  2246. ; move.b (a0,d1.w*4),d7
  2247. ; beq.s .noplottt
  2248.  
  2249.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2250.  dbra d0,PENUMBRA
  2251.  bra.s PASTAC 
  2252.  
  2253. .noplottt
  2254.  addq #1,a2
  2255.  dbra d0,PENUMBRA
  2256.  bra.s PASTAC
  2257.  
  2258. INTHELIGHT:
  2259.  
  2260.  moveq #0,d1
  2261.  swap d6
  2262.  move.w d6,d1
  2263.  lsl.w #8,d1
  2264.  swap d4
  2265.  move.b d4,d1
  2266.  swap d4
  2267.  swap d6
  2268.  add.l a5,d4
  2269.  add.l a3,d6
  2270.  
  2271.  moveq #0,d7
  2272.  move.b (a7,d1.l),d7
  2273.  cmp.w d7,d5
  2274.  bgt.s INTOPENUM
  2275. INTOLIGHT:
  2276.  move.w a6,d7
  2277.  swap d2
  2278.  move.w d2,d1
  2279.  asl.w #8,d1
  2280.  swap d3
  2281.  move.b d3,d1
  2282.  swap d2
  2283.  swap d3
  2284.  add.l a1,d2
  2285.  add.l a4,d3
  2286.  
  2287. ; move.b (a0,d1.w*4),d7
  2288. ; beq.s .noplottt
  2289.  
  2290.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2291.  dbra d0,INTHELIGHT
  2292.  bra.s PASTAC 
  2293.  
  2294. .noplottt:
  2295.  addq #1,a2
  2296.  dbra d0,INTHELIGHT
  2297.  
  2298. PASTAC
  2299.  
  2300.  move.l SAVESTACK,a7
  2301.  
  2302.  move.l (a7)+,d1
  2303.  move.l (a7)+,a0
  2304.  move.l (a7)+,a2
  2305.  
  2306. .noline:
  2307.  add.w #320,a2
  2308.  
  2309.  swap d1
  2310.  dbra d1,DOAHORLINE
  2311.  
  2312. NOPOLYGON:
  2313. polybehind:
  2314.  rts
  2315.  
  2316. TEXTUREPAL:
  2317.  
  2318. SAVESTACK: dc.l 0
  2319. HIGHPOLY: dc.w 0
  2320. LEN1: dc.w 0
  2321. BRIGHTNESS: dc.l 0
  2322. TRANSTEXT: dc.w 0
  2323. AANG: dc.w 0
  2324. BANG: dc.w 0
  2325. CANG: dc.w 0
  2326. DANG: dc.w 0
  2327.  
  2328.  
  2329.  
  2330. GOURPOLY: 
  2331.  
  2332. DOAHORLINEGOUR:
  2333.  swap d1
  2334.  
  2335.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2336.  move.w (a0)+,d7
  2337.  asr.w #2,d0
  2338.  asr.w #2,d7
  2339.  sub.w d7,d0
  2340.  bge.s .okflibble
  2341.  
  2342.  add.w #14,a0
  2343.  add.w #320,a2
  2344.  swap d1
  2345.  dbra d1,DOAHORLINEGOUR
  2346.  bra NOPOLYGON
  2347.  
  2348. .okflibble:
  2349.  
  2350.  move.l a2,-(a7)
  2351.  
  2352.  add.w d7,a2
  2353.  ext.l d0
  2354.  addq #1,d0
  2355.  
  2356.  move.b RIGHTUVS-LEFTUVS(a0),d3
  2357.  move.b (a0),d2
  2358.  ext.w d3
  2359.  ext.w d2
  2360.  
  2361.  tst.w d2
  2362.  blt .bothtowards
  2363.  
  2364. ; bgt .firstaway
  2365.  tst.w d3
  2366.  blt .bothtowards
  2367.  bra .bothaway
  2368.  
  2369. .firsttowards:
  2370.  tst.w d3
  2371.  ble .bothtowards
  2372.  
  2373. ; First is towards and second away...
  2374.  
  2375.  move.w d0,d7    ; total length
  2376.  move.w d0,d6
  2377.  neg.w d2
  2378.  add.w d2,d3
  2379.  muls d2,d6
  2380.  divs d3,d6    ; length of first bit
  2381.  sub.w d6,d7    ; length of second bit
  2382.  move.w d6,FIRSTLEN
  2383.  move.w d7,LASTLEN
  2384.  
  2385.  tst.w FIRSTLEN
  2386.  beq .bothaway
  2387.  tst.w LASTLEN
  2388.  beq .bothtowards
  2389.  
  2390.  moveq #0,d2
  2391.  moveq #0,d3
  2392.  moveq #0,d4
  2393.  moveq #0,d5
  2394.  move.b 6(a0),d2
  2395.  move.b 7(a0),d3
  2396.  
  2397.  move.w d2,FIRSTU
  2398.  move.w d3,FIRSTV
  2399.  
  2400.  move.w d2,d4
  2401.  move.w d3,d5
  2402.  sub.w #128,d2
  2403.  sub.w #128,d3
  2404.  muls d2,d2
  2405.  muls d3,d3
  2406.  add.l d3,d2
  2407.  jsr CALCSQROOT
  2408.  
  2409.  tst.w d2
  2410.  beq.s .nochng
  2411.  
  2412.  sub.w #128,d4
  2413.  sub.w #128,d5
  2414.  muls #127,d4
  2415.  muls #127,d5
  2416.  divs d2,d4
  2417.  divs d2,d5
  2418.  add.w #128,d4
  2419.  add.w #128,d5
  2420.  
  2421. .nochng:
  2422.  
  2423.  move.w d4,MIDU
  2424.  move.w d5,MIDV
  2425.  
  2426.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  2427.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  2428.  move.w d4,SECU
  2429.  move.w d5,SECV
  2430.  
  2431.  move.w d4,d2
  2432.  move.w d5,d3
  2433.  
  2434.  sub.w #128,d2
  2435.  sub.w #128,d3
  2436.  muls d2,d2
  2437.  muls d3,d3
  2438.  add.l d3,d2
  2439.  jsr CALCSQROOT
  2440.  
  2441.  tst.w d2
  2442.  beq.s .nochng2
  2443.  
  2444.  sub.w #128,d4
  2445.  sub.w #128,d5
  2446.  muls #127,d4
  2447.  muls #127,d5
  2448.  divs d2,d4
  2449.  divs d2,d5
  2450.  add.w #128,d4
  2451.  add.w #128,d5
  2452.  
  2453. .nochng2:
  2454.  
  2455.  add.w MIDU,d4
  2456.  add.w MIDV,d5
  2457.  asr.w #1,d4
  2458.  asr.w #1,d5
  2459.  move.w d4,MIDU
  2460.  move.w d5,MIDV 
  2461.  
  2462.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2463.  move.l (a0)+,d2 
  2464.  
  2465.  and.l #$ffffff,d2
  2466.  and.l #$ffffff,d7
  2467.  
  2468.  moveq #0,d3
  2469.  moveq #0,d5
  2470.  move.w d2,d3
  2471. ; bge.s .okp1
  2472. ; moveq #0,d3
  2473. ;.okp1
  2474.  move.w d7,d5
  2475. ; bge.s .okp2
  2476. ; moveq #0,d5
  2477. ;.okp2
  2478.  
  2479.  swap d3
  2480.  swap d5
  2481.  sub.l d3,d5
  2482.  divs.l d0,d5
  2483.  asr.l #8,d5
  2484.  move.w d5,RIGHTBRIGHT
  2485.  asr.l #8,d3
  2486.  move.w d3,LEFTBRIGHT
  2487.  
  2488.  clr.w d2
  2489.  clr.w d7
  2490.  sub.l d2,d7
  2491.  asl.l #8,d2
  2492.  divs.l d0,d7
  2493.  asl.l #8,d7
  2494.  
  2495.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2496.  move.l (a0)+,d3
  2497.  
  2498.  moveq #0,d4
  2499.  moveq #0,d5
  2500.  
  2501. ; move.w d6,d5
  2502. ; move.w d3,d4
  2503. ; move.b #0,d4
  2504. ; move.b #0,d5
  2505.  
  2506.  move.w FIRSTU,d4
  2507.  move.w MIDU,d5
  2508.  lsl.l #8,d4
  2509.  lsl.l #8,d5
  2510.  
  2511.  sub.l d4,d5
  2512.  divs.l FIRSTLEN-2,d5
  2513.  
  2514.  move.w d4,d2
  2515.  move.w d5,d7
  2516.  move.l d7,a1
  2517.  moveq #0,d4
  2518.  moveq #0,d5
  2519.  
  2520. ; move.b d6,d5
  2521. ; move.b d3,d4
  2522.  
  2523. ; swap d5
  2524. ; swap d4
  2525.  
  2526.  move.w FIRSTV,d4
  2527.  move.w MIDV,d5
  2528.  swap d4
  2529.  swap d5
  2530.  
  2531.  sub.l d4,d5
  2532.  divs.l FIRSTLEN-2,d5
  2533.  
  2534.  move.l d5,a3
  2535.  move.l d4,d5
  2536.   
  2537.  clr.w d3
  2538.  clr.w d6
  2539.  sub.l d3,d6
  2540.  divs.l d0,d6
  2541.  move.l d6,a4
  2542.  
  2543.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2544.  move.w (a0)+,d4
  2545.  swap d7
  2546.  clr.w d7
  2547.  swap d4
  2548.  clr.w d4
  2549.  sub.l d4,d7
  2550.  divs.l d0,d7
  2551.  move.l d7,a5
  2552.  
  2553. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  2554. ; swap d7
  2555. ; clr.w d7
  2556.  move.w (a0)+,d7
  2557. ; swap d5
  2558. ; clr.w d5
  2559. ; sub.l d5,d7
  2560. ; divs.l d0,d7
  2561. ; move.l d7,a6
  2562.  
  2563.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2564.  swap d7
  2565.  clr.w d7
  2566.  move.w (a0)+,d6
  2567.  swap d6
  2568.  clr.w d6
  2569.  sub.l d6,d7
  2570.  divs.l d0,d7
  2571.  
  2572.  lsl.l #8,d6
  2573.  lsl.l #8,d7
  2574.  
  2575.  move.w RIGHTBRIGHT,d7
  2576.  move.l d7,a6
  2577.  
  2578.  move.l a0,-(a7)
  2579.  move.l d1,-(a7)
  2580.  move.l #TEXTURES,a0
  2581.  move.w TEXTUREADD,d7
  2582.  bge.s .okaddtes3
  2583.  and.w #$7fff,d7
  2584.  add.l #65536*4,a0
  2585. .okaddtes3:
  2586.  ext.l d7
  2587. ; add.l d7,d7
  2588.  asl.l #8,d7
  2589.  add.l d7,a0
  2590.  move.w #0,d7
  2591.  
  2592.  move.w LEFTBRIGHT,d6
  2593.  
  2594.  subq #1,d0
  2595.  swap d0
  2596.  move.w HIGHPOLY,d0
  2597.  swap d0
  2598.  
  2599.  
  2600. ; d0=xdist
  2601. ; d2=U    a1=DU
  2602. ; d3=V  a4=DV
  2603. ; d4=X  a5=DX
  2604. ; d5=Y  a6=DY
  2605. ; d6=Z  a3=DZ
  2606.  
  2607. ; d0= polynum : polynum : counter : counter
  2608. ; d1= scratch : scratch : scratch : scratch
  2609. ; d2= u : uacc : sv : svacc
  2610. ; d3= v : v : vacc : vacc
  2611. ; d4= x : x : xacc : xacc
  2612. ; d5= su : su : suacc : suacc
  2613. ; d6= z : zacc : bright : brightacc
  2614. ; d7= scratch : scratch : scratch : scratch
  2615.  
  2616. ; a0= textures
  2617. ; a1= uspeed : uspeed : suspeed : suspeed
  2618. ; a2= screen pointer
  2619. ; a3= svspeed : svspeed : svspeed : svspeed
  2620. ; a4= vspeed : vspeed : vspeed : vspeed
  2621. ; a5= xspeed : xspeed : xspeed : xspeed
  2622. ; a6= zspeed : zspeed :brightspeed : brightspeed
  2623. ; a7= shadowmap pointer
  2624.  
  2625.  
  2626.  move.w FIRSTLEN,d0
  2627.  sub.w #1,d0
  2628.  bsr STARTLINE
  2629.  
  2630.  move.l #0,d5
  2631.  move.w #0,d2
  2632.  move.l #0,a3
  2633.  
  2634.  move.w LASTLEN,d0
  2635.  sub.w #1,d0
  2636.  
  2637.  bsr STARTLINE
  2638.  
  2639.  
  2640.  move.l (a7)+,d1
  2641.  move.l (a7)+,a0
  2642.  move.l (a7)+,a2
  2643.  
  2644.  bra .noline
  2645.  
  2646. .firstaway:
  2647.  tst.w d3
  2648.  bge .bothaway
  2649.  
  2650.  
  2651. ; first is away and second is towards...
  2652.  
  2653. ; this really isn't going to work...
  2654.  
  2655.  move.w d0,d7    ; total length
  2656.  move.w d0,d6
  2657.  neg.w d3
  2658.  add.w d2,d3
  2659.  muls d2,d6
  2660.  divs d3,d6    ; length of first bit
  2661.  sub.w d6,d7    ; length of second bit
  2662.  move.w d6,FIRSTLEN
  2663.  move.w d7,LASTLEN
  2664.  
  2665.  tst.w FIRSTLEN
  2666.  beq .bothaway
  2667.  tst.w LASTLEN
  2668.  beq .bothtowards
  2669.  
  2670.  moveq #0,d2
  2671.  moveq #0,d3
  2672.  moveq #0,d4
  2673.  moveq #0,d5
  2674.  move.b 6(a0),d2
  2675.  move.b 7(a0),d3
  2676.  
  2677.  move.w d2,FIRSTU
  2678.  move.w d3,FIRSTV
  2679.  
  2680.  move.w d2,d4
  2681.  move.w d3,d5
  2682.  sub.w #128,d2
  2683.  sub.w #128,d3
  2684.  muls d2,d2
  2685.  muls d3,d3
  2686.  add.l d3,d2
  2687.  jsr CALCSQROOT
  2688.  
  2689.  tst.w d2
  2690.  beq.s .nochng22
  2691.  
  2692.  sub.w #128,d4
  2693.  sub.w #128,d5
  2694.  muls #127,d4
  2695.  muls #127,d5
  2696.  divs d2,d4
  2697.  divs d2,d5
  2698.  add.w #128,d4
  2699.  add.w #128,d5
  2700.  
  2701. .nochng22:
  2702.  
  2703.  move.w d4,MIDU
  2704.  move.w d5,MIDV
  2705.  
  2706.  moveq #0,d4
  2707.  moveq #0,d5
  2708.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  2709.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  2710.  move.w d4,SECU
  2711.  move.w d5,SECV
  2712.  
  2713.  move.w d4,d2
  2714.  move.w d5,d3
  2715.  
  2716.  sub.w #128,d2
  2717.  sub.w #128,d3
  2718.  muls d2,d2
  2719.  muls d3,d3
  2720.  add.l d3,d2
  2721.  jsr CALCSQROOT
  2722.  
  2723.  tst.w d2
  2724.  beq.s .nochng222
  2725.  
  2726.  sub.w #128,d4
  2727.  sub.w #128,d5
  2728.  muls #127,d4
  2729.  muls #127,d5
  2730.  divs d2,d4
  2731.  divs d2,d5
  2732.  add.w #128,d4
  2733.  add.w #128,d5
  2734.  
  2735. .nochng222:
  2736.  
  2737.  add.w MIDU,d4
  2738.  add.w MIDV,d5
  2739.  asr.w #1,d4
  2740.  asr.w #1,d5
  2741.  move.w d4,MIDU
  2742.  move.w d5,MIDV
  2743.  
  2744.  
  2745.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2746.  move.l (a0)+,d2 
  2747.  
  2748.  and.l #$ffffff,d2
  2749.  and.l #$ffffff,d7
  2750.  
  2751.  moveq #0,d3
  2752.  moveq #0,d5
  2753.  move.w d2,d3
  2754.  move.w d7,d5
  2755.  swap d3
  2756.  swap d5
  2757.  sub.l d3,d5
  2758.  divs.l d0,d5
  2759.  asr.l #8,d5
  2760.  move.w d5,RIGHTBRIGHT
  2761.  asr.l #8,d3
  2762.  move.w d3,LEFTBRIGHT
  2763.  
  2764.  clr.w d2
  2765.  clr.w d7
  2766.  sub.l d2,d7
  2767.  asl.l #8,d2
  2768.  divs.l d0,d7
  2769.  asl.l #8,d7
  2770.  
  2771.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2772.  move.l (a0)+,d3
  2773.  
  2774.  moveq #0,d4
  2775.  moveq #0,d5
  2776.  
  2777.  move.w MIDU,d4
  2778.  move.w SECU,d5
  2779.  lsl.w #8,d4
  2780.  lsl.w #8,d5
  2781.  
  2782. ; move.w d6,d5
  2783. ; move.w d3,d4
  2784. ; move.b #0,d4
  2785. ; move.b #0,d5
  2786.  
  2787.  sub.l d4,d5
  2788.  divs.l LASTLEN-2,d5
  2789.  
  2790.  move.w d4,d2
  2791.  move.w d5,d7
  2792.  move.l d7,a1
  2793.  moveq #0,d4
  2794.  moveq #0,d5
  2795.  
  2796.  move.w MIDV,d4
  2797.  move.w SECV,d5
  2798.  
  2799.  swap d5
  2800.  swap d4
  2801.  
  2802.  sub.l d4,d5
  2803.  divs.l LASTLEN-2,d5
  2804.  
  2805.  move.l d5,a3
  2806.  move.l d4,d5
  2807.  
  2808.  clr.w d3
  2809.  clr.w d6
  2810.  sub.l d3,d6
  2811.  divs.l d0,d6
  2812.  move.l d6,a4
  2813.  
  2814.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2815.  move.w (a0)+,d4
  2816.  swap d7
  2817.  clr.w d7
  2818.  swap d4
  2819.  clr.w d4
  2820.  sub.l d4,d7
  2821.  divs.l d0,d7
  2822.  move.l d7,a5
  2823.  
  2824. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  2825. ; swap d7
  2826. ; clr.w d7
  2827.  move.w (a0)+,d7
  2828. ; swap d5
  2829. ; clr.w d5
  2830. ; sub.l d5,d7
  2831. ; divs.l d0,d7
  2832. ; move.l d7,a6
  2833.  
  2834.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2835.  swap d7
  2836.  clr.w d7
  2837.  move.w (a0)+,d6
  2838.  swap d6
  2839.  clr.w d6
  2840.  sub.l d6,d7
  2841.  divs.l d0,d7
  2842.  
  2843.  lsl.l #8,d6
  2844.  lsl.l #8,d7
  2845.  
  2846.  move.w RIGHTBRIGHT,d7
  2847.  move.l d7,a6
  2848.  
  2849.  move.l a0,-(a7)
  2850.  move.l d1,-(a7)
  2851.  move.l #TEXTURES,a0
  2852.  move.w TEXTUREADD,d7
  2853.  bge.s .okaddtes4
  2854.  and.w #$7fff,d7
  2855.  add.l #65536*4,a0
  2856. .okaddtes4:
  2857.  ext.l d7
  2858. ; add.l d7,d7
  2859.  asl.l #8,d7
  2860.  add.l d7,a0
  2861.  move.w #0,d7
  2862.  
  2863.  move.w LEFTBRIGHT,d6
  2864.  
  2865.  
  2866.  subq #1,d0
  2867.  swap d0
  2868.  move.w HIGHPOLY,d0
  2869.  swap d0
  2870.  
  2871.  
  2872. ; d0=xdist
  2873. ; d2=U    a1=DU
  2874. ; d3=V  a4=DV
  2875. ; d4=X  a5=DX
  2876. ; d5=Y  a6=DY
  2877. ; d6=Z  a3=DZ
  2878.  
  2879. ; d0= polynum : polynum : counter : counter
  2880. ; d1= scratch : scratch : scratch : scratch
  2881. ; d2= u : uacc : sv : svacc
  2882. ; d3= v : v : vacc : vacc
  2883. ; d4= x : x : xacc : xacc
  2884. ; d5= su : su : suacc : suacc
  2885. ; d6= z : zacc : bright : brightacc
  2886. ; d7= scratch : scratch : scratch : scratch
  2887.  
  2888. ; a0= textures
  2889. ; a1= uspeed : uspeed : suspeed : suspeed
  2890. ; a2= screen pointer
  2891. ; a3= svspeed : svspeed : svspeed : svspeed
  2892. ; a4= vspeed : vspeed : vspeed : vspeed
  2893. ; a5= xspeed : xspeed : xspeed : xspeed
  2894. ; a6= zspeed : zspeed :brightspeed : brightspeed
  2895. ; a7= shadowmap pointer
  2896.  
  2897.  move.w d2,-(a7)
  2898.  move.l d5,-(a7)
  2899.  move.l a3,-(a7)
  2900.  
  2901.  move.w #0,d2
  2902.  move.l #0,d5
  2903.  move.l #0,a3
  2904.  
  2905.  move.w FIRSTLEN,d0
  2906.  subq #1,d0
  2907.  bsr STARTLINE
  2908.  
  2909.  
  2910.  move.l (a7)+,a3
  2911.  move.l (a7)+,d5
  2912.  move.w (a7)+,d2
  2913.  
  2914.  move.w LASTLEN,d0
  2915.  subq #1,d0
  2916.  
  2917.  bsr STARTLINE
  2918.  
  2919.  
  2920.  move.l (a7)+,d1
  2921.  move.l (a7)+,a0
  2922.  move.l (a7)+,a2
  2923.  
  2924.  bra .noline
  2925.  
  2926.  
  2927. .bothaway:
  2928.  
  2929.  move.w #0,6+RIGHTUVS-LEFTUVS(a0)
  2930.  move.w #0,6(a0)
  2931.  
  2932. .bothtowards:
  2933.  
  2934.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2935.  move.l (a0)+,d2 
  2936.  
  2937.  and.l #$ffffff,d2
  2938.  and.l #$ffffff,d7
  2939.  
  2940.  moveq #0,d3
  2941.  moveq #0,d5
  2942.  move.w d2,d3
  2943.  move.w d7,d5
  2944.  swap d3
  2945.  swap d5
  2946.  sub.l d3,d5
  2947.  divs.l d0,d5
  2948.  asr.l #8,d5
  2949.  move.w d5,RIGHTBRIGHT
  2950.  asr.l #8,d3
  2951.  move.w d3,LEFTBRIGHT
  2952.  
  2953.  clr.w d2
  2954.  clr.w d7
  2955.  sub.l d2,d7
  2956.  asl.l #8,d2
  2957.  divs.l d0,d7
  2958.  asl.l #8,d7
  2959.  
  2960.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2961.  move.l (a0)+,d3
  2962.  
  2963.  moveq #0,d4
  2964.  moveq #0,d5
  2965.  
  2966.  move.w d6,d5
  2967.  move.w d3,d4
  2968.  move.b #0,d4
  2969.  move.b #0,d5
  2970.  
  2971.  sub.l d4,d5
  2972.  divs.l d0,d5
  2973.  
  2974.  move.w d4,d2
  2975.  move.w d5,d7
  2976.  move.l d7,a1
  2977.  moveq #0,d4
  2978.  moveq #0,d5
  2979.  
  2980.  move.b d6,d5
  2981.  move.b d3,d4
  2982.  
  2983.  swap d5
  2984.  swap d4
  2985.  
  2986.  sub.l d4,d5
  2987.  divs.l d0,d5
  2988.  
  2989.  move.l d5,a3
  2990.  move.l d4,d5
  2991.  
  2992.   
  2993.  clr.w d3
  2994.  clr.w d6
  2995.  sub.l d3,d6
  2996.  divs.l d0,d6
  2997.  move.l d6,a4
  2998.  
  2999.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3000.  move.w (a0)+,d4
  3001.  swap d7
  3002.  clr.w d7
  3003.  swap d4
  3004.  clr.w d4
  3005.  sub.l d4,d7
  3006.  divs.l d0,d7
  3007.  move.l d7,a5
  3008.  
  3009. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3010. ; swap d7
  3011. ; clr.w d7
  3012.  move.w (a0)+,d7
  3013. ; swap d5
  3014. ; clr.w d5
  3015. ; sub.l d5,d7
  3016. ; divs.l d0,d7
  3017. ; move.l d7,a6
  3018.  
  3019.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3020.  swap d7
  3021.  clr.w d7
  3022.  move.w (a0)+,d6
  3023.  swap d6
  3024.  clr.w d6
  3025.  sub.l d6,d7
  3026.  divs.l d0,d7
  3027.  
  3028.  lsl.l #8,d6
  3029.  lsl.l #8,d7
  3030.  
  3031.  move.w RIGHTBRIGHT,d7
  3032.  move.l d7,a6
  3033.  
  3034.  move.l a0,-(a7)
  3035.  move.l d1,-(a7)
  3036.  move.l #TEXTURES,a0
  3037.  move.w TEXTUREADD,d7
  3038.  bge.s .okaddtes5
  3039.  and.w #$7fff,d7
  3040.  add.l #65536*4,a0
  3041. .okaddtes5:
  3042.  ext.l d7
  3043.  asl.l #8,d7
  3044.  add.l d7,a0
  3045.  move.w #0,d7
  3046.  
  3047.  move.w LEFTBRIGHT,d6
  3048.  
  3049.  subq #1,d0
  3050.  swap d0
  3051.  move.w HIGHPOLY,d0
  3052.  swap d0
  3053.  
  3054.  
  3055. ; d0=xdist
  3056. ; d2=U    a1=DU
  3057. ; d3=V  a4=DV
  3058. ; d4=X  a5=DX
  3059. ; d5=Y  a6=DY
  3060. ; d6=Z  a3=DZ
  3061.  
  3062. ; d0= polynum : polynum : counter : counter
  3063. ; d1= scratch : scratch : scratch : scratch
  3064. ; d2= u : uacc : sv : svacc
  3065. ; d3= v : v : vacc : vacc
  3066. ; d4= x : x : xacc : xacc
  3067. ; d5= su : su : suacc : suacc
  3068. ; d6= z : zacc : bright : brightacc
  3069. ; d7= scratch : scratch : scratch : scratch
  3070.  
  3071. ; a0= textures
  3072. ; a1= uspeed : uspeed : suspeed : suspeed
  3073. ; a2= screen pointer
  3074. ; a3= svspeed : svspeed : svspeed : svspeed
  3075. ; a4= vspeed : vspeed : vspeed : vspeed
  3076. ; a5= xspeed : xspeed : xspeed : xspeed
  3077. ; a6= zspeed : zspeed :brightspeed : brightspeed
  3078. ; a7= shadowmap pointer
  3079.  
  3080.  bsr STARTLINE
  3081.  
  3082.  move.l (a7)+,d1
  3083.  move.l (a7)+,a0
  3084.  move.l (a7)+,a2
  3085.  
  3086. .noline:
  3087.  add.w #320,a2
  3088.  
  3089.  swap d1
  3090.  dbra d1,DOAHORLINEGOUR
  3091.  
  3092.  bra NOPOLYGON
  3093.  
  3094.  
  3095.  
  3096.  
  3097.  
  3098. *******************************
  3099. STARTLINE:
  3100.  
  3101.  move.l a7,SAVESTACK
  3102.  move.l #SHADOWBUFFER,a7
  3103.  
  3104.  moveq #0,d1
  3105.  swap d6
  3106.  move.w d6,d1
  3107.  swap d4
  3108.  move.b d4,d1
  3109.  swap d4
  3110.  swap d6
  3111.  
  3112.  swap d0
  3113.  moveq #0,d7
  3114.  move.b (a7,d1.l*2),d7
  3115.  cmp.w d7,d0
  3116.  ble .startlight
  3117.  swap d0
  3118.  bra INTHEDARKGOUR
  3119. .startlight:
  3120.  swap d0
  3121.  bra INTHELIGHTGOUR 
  3122. .startdark:
  3123. ***********************************
  3124.  
  3125.  
  3126.  
  3127. PENUMBRAGOUR:
  3128.  moveq #0,d1
  3129.  swap d6
  3130.  move.w d6,d1
  3131.  swap d4
  3132.  move.b d4,d1
  3133.  swap d4
  3134.  swap d6
  3135.  add.l a5,d4
  3136.  add.l a6,d6
  3137.  add.l a3,d5
  3138.  
  3139.  swap d0
  3140.  moveq #0,d7
  3141.  move.b (a7,d1.l*2),d7
  3142.  cmp.w d7,d0
  3143.  ble INTOLIGHTGOUR
  3144.  bra.s INTODARKGOUR
  3145.  
  3146. INTHEDARKGOUR:
  3147.  moveq #0,d1
  3148.  swap d6
  3149.  move.w d6,d1
  3150.  swap d4
  3151.  move.b d4,d1
  3152.  swap d4
  3153.  swap d6
  3154.  add.l a5,d4
  3155.  add.l a6,d6
  3156.  add.l a3,d5
  3157.  
  3158.  swap d0
  3159.  moveq #0,d7
  3160.  move.b (a7,d1.l*2),d7
  3161.  cmp.w d7,d0
  3162.  ble.s INTOPENUMGOUR
  3163. INTODARKGOUR:
  3164.  swap d0
  3165.  move.l #(28*32*256),d7
  3166.  
  3167. ;**********************
  3168. ; moveq #0,d7
  3169. ;********************** 
  3170.  
  3171.  swap d2
  3172.  move.w d2,d1
  3173.  swap d3
  3174.  move.b d3,d1
  3175.  swap d2
  3176.  swap d3
  3177.  add.l a1,d2
  3178.  add.l a4,d3
  3179.  
  3180.  move.b 1(a0,d1.w*4),d7
  3181.  bra DARKplottt
  3182.  
  3183. .noplottt
  3184.  addq #1,a2
  3185.  dbra d0,INTHEDARKGOUR
  3186.  bra DONEDONEBUM
  3187.  
  3188. INTOPENUMGOUR:
  3189.  swap d0
  3190.  move.w d6,d7
  3191.  
  3192.  sub.w #$1c00,d7
  3193.  asr.w #1,d7
  3194.  add.w #$1c00,d7
  3195.  sub.b d7,d7
  3196.  
  3197.  asl.l #5,d7
  3198.  
  3199. *********************
  3200. ; moveq #0,d7
  3201. *****************
  3202.  
  3203.  swap d2
  3204.  move.w d2,d1
  3205.  swap d3
  3206.  move.b d3,d1
  3207.  swap d2
  3208.  swap d3
  3209.  add.l a1,d2
  3210.  add.l a4,d3
  3211.  
  3212.  move.b 1(a0,d1.w*4),d7
  3213.  bra.s PENUMplottt
  3214.  
  3215. .noplottt
  3216.  addq #1,a2
  3217.  dbra d0,PENUMBRAGOUR
  3218.  bra DONEDONEBUM
  3219.  
  3220.  
  3221. INTHELIGHTGOUR:
  3222.  
  3223.  moveq #0,d1
  3224.  swap d6
  3225.  move.w d6,d1
  3226.  swap d4
  3227.  move.b d4,d1
  3228.  swap d4
  3229.  swap d6
  3230.  add.l a5,d4
  3231.  add.l a6,d6
  3232.  add.l a3,d5
  3233.  
  3234.  swap d0
  3235.  moveq #0,d7
  3236.  move.b (a7,d1.l*2),d7
  3237.  cmp.w d7,d0
  3238.  bgt.s INTOPENUMGOUR
  3239. INTOLIGHTGOUR:
  3240.  swap d0
  3241.  
  3242.  swap d2
  3243.  move.w d2,d1
  3244.  swap d3
  3245.  move.b d3,d1
  3246.  swap d2
  3247.  swap d3
  3248.  
  3249.  move.l (a0,d1.w*4),d1        ; SPEC COL OFX OFY
  3250.  
  3251.  add.l a1,d2
  3252.  add.l a4,d3
  3253.  
  3254.  bra.s LIGHTPLOTT
  3255. .noplottt:
  3256.  addq #1,a2
  3257.  dbra d0,INTHELIGHTGOUR
  3258. FLIBBLEY:
  3259.  bra.s DONEDONEBUM
  3260.  
  3261. PENUMplottt
  3262.  move.b GOURPAL(pc,d7.l),(a2)+
  3263.  dbra d0,PENUMBRAGOUR
  3264.  bra.s DONEDONEBUM
  3265.  
  3266. DARKplottt
  3267.  move.b GOURPAL(pc,d7.l),(a2)+
  3268.  dbra d0,INTHEDARKGOUR
  3269.  bra.s DONEDONEBUM
  3270.  
  3271. LIGHTPLOTT:
  3272.  moveq #0,d7
  3273.  move.w d2,d7
  3274.  swap d5
  3275.  move.b d5,d7
  3276.  swap d5
  3277.  add.w d1,d7    ; coord in spec map
  3278.  
  3279.  clr.w d1
  3280.  swap d1
  3281.  
  3282.  move.b 1(a7,d7.l*2),d7    ; specular value of point.
  3283.  lsl.w #8,d7
  3284.  
  3285.  add.w d7,d1
  3286.  tst.w d1
  3287.  bgt.s .okshiney
  3288.  
  3289.  and.w #$ff,d1
  3290.  
  3291. .okshiney
  3292.  
  3293.  move.w d6,d7
  3294.  sub.b d7,d7
  3295.  lsl.l #5,d7
  3296.  add.l d7,d1
  3297.  
  3298.  move.b GOURPAL(pc,d1.l),(a2)+
  3299.  dbra d0,INTHELIGHTGOUR
  3300. DONEDONEBUM:
  3301.  move.l SAVESTACK,a7
  3302.  rts
  3303.  
  3304. GOURPAL: incbin "ab3:includes/bigshadow.pal"
  3305.  
  3306.  
  3307.  
  3308.  
  3309. LEFTSHINEV: dc.l 0
  3310. RIGHTSHINEV: dc.l 0
  3311. LEFTSHINEU: dc.l 0
  3312. RIGHTSHINEU: dc.l 0
  3313.  
  3314. TOPPTR: dc.l 0
  3315. TOPPTNUM: dc.w 0
  3316. BOTPTNUM: dc.w 0
  3317. LEFTBRIGHT: dc.w 0
  3318. RIGHTBRIGHT: dc.l 0
  3319. LEFTSPEC: dc.w 0
  3320. RIGHTSPEC: dc.w 0
  3321.  
  3322. ***********************************************
  3323.     
  3324. SIMPLECALCLINE:
  3325.  move.l #ONSCREENPTS,a1
  3326.  
  3327.  move.w 2(a1,d0.w*4),d2        ;fy
  3328.  move.w 2(a1,d1.w*4),d7        ;sy
  3329.  
  3330.  move.l #RIGHTUVS,a3
  3331.  asr.w #2,d2
  3332.  asr.w #2,d7
  3333.  cmp.w d2,d7 
  3334.  beq .noline
  3335.  
  3336.  bgt.s .lineonright
  3337. .lineonleft:
  3338.  move.l #LEFTUVS,a3
  3339.  exg d0,d1
  3340.  exg d2,d7
  3341.  
  3342. .lineonright:
  3343.  move.w d0,TOPPTNUM
  3344.  move.w d1,BOTPTNUM
  3345.  
  3346.  sub.w d2,d7
  3347.  asl.w #4,d2
  3348.  add.w d2,a3
  3349.  move.l a3,TOPPTR
  3350.  
  3351.  move.w d7,YDIFF
  3352.  
  3353.  move.w (a1,d0.w*4),d3        ;fx
  3354.  move.w (a1,d1.w*4),d7        ;sx
  3355.  
  3356.  sub.w d3,d7
  3357.  swap d3
  3358.  swap d7
  3359.  clr.w d3
  3360.  clr.w d7
  3361.  divs.l YDIFF-2,d7
  3362.  move.l d7,a0    ; dx
  3363.  
  3364.  move.l #UVCOORDS,a2
  3365.  move.l #SHADOWPTS,a1
  3366.  
  3367.  move.w (a2,d0.w*4),d4
  3368.  move.w 2(a2,d0.w*4),d5
  3369.  move.w (a2,d1.w*4),d6
  3370.  move.w 2(a2,d1.w*4),d7
  3371.  
  3372.  sub.w d4,d6
  3373.  sub.w d5,d7
  3374.  swap d4
  3375.  swap d5
  3376.  clr.w d4
  3377.  clr.w d5
  3378.  swap d6
  3379.  swap d7
  3380.  clr.w d6
  3381.  clr.w d7
  3382.  
  3383.  divs.l YDIFF-2,d6
  3384.  divs.l YDIFF-2,d7
  3385.  
  3386.  move.l d6,a4
  3387.  move.l d7,a5
  3388.  
  3389.  muls #10,d0
  3390.  muls #10,d1
  3391.  move.l (a1,d0.w),d6
  3392.  
  3393.  move.l (a1,d1.w),d7
  3394.  asl.l #5,d6
  3395.  asl.l #5,d7
  3396.  sub.l d6,d7
  3397.  divs.l YDIFF-2,d7
  3398.  move.l d7,a2
  3399.  move.l d6,a6
  3400.  
  3401.  move.l 4(a1,d0.w),d6
  3402.  move.l 4(a1,d1.w),d7
  3403.  asl.l #5,d6
  3404.  asl.l #5,d7
  3405.  sub.l d6,d7
  3406.  divs.l YDIFF-2,d7
  3407.  exg d7,a6
  3408.  exg d7,d6
  3409.  
  3410.  move.w 8(a1,d0.w),d0
  3411.  move.w 8(a1,d1.w),d1
  3412.  swap d0
  3413.  swap d1
  3414.  clr.w d0
  3415.  clr.w d1
  3416.  asr.l #2,d0
  3417.  asr.l #2,d1
  3418.  sub.l d0,d1
  3419.  divs.l YDIFF-2,d1
  3420.  move.l d1,a1
  3421.  move.l YDIFF-2,d1
  3422.  subq #1,d1
  3423.  
  3424. ; d3=sx a0=dsx
  3425. ; d4=u a4=du
  3426. ; d5=v a5=dv
  3427. ; d6=x a2=dx
  3428. ; d7=y a6=dy
  3429. ; d0=z a1=dz
  3430. ; d1=dsy
  3431.  
  3432.  
  3433.  add.l #128*65536,d6
  3434.  add.l #128*65536,d7
  3435.  add.l #128*65536,d0
  3436.  
  3437. .PUTINLINE:
  3438.  swap d3
  3439.  move.w d3,(a3)+
  3440.  swap d3
  3441.  add.l a0,d3
  3442.  move.l d4,(a3)+
  3443.  add.l a4,d4
  3444.  move.l d5,(a3)+
  3445.  swap d6
  3446.  add.l a5,d5
  3447.  move.w d6,(a3)+
  3448.  swap d6
  3449.  swap d7
  3450.  add.l a2,d6
  3451.  move.w d7,(a3)+
  3452.  swap d7
  3453.  swap d0
  3454.  add.l a6,d7
  3455.  move.w d0,(a3)+
  3456.  swap d0
  3457.  add.l a1,d0
  3458.  dbra d1,.PUTINLINE
  3459.  
  3460.  tst.b Gouraud
  3461.  beq .noline
  3462.  
  3463.  move.w TOPPTNUM,d0
  3464.  move.w BOTPTNUM,d1
  3465.  move.l TOPPTR,a3
  3466.  moveq #0,d6
  3467.  move.w YDIFF,d6
  3468.  
  3469.  move.l #SPECBRIGHTS,a2
  3470.  
  3471.  moveq #0,d2
  3472.  moveq #0,d3
  3473.  move.b (a2,d0.w*4),d2
  3474.  move.b 1(a2,d0.w*4),d3
  3475.  sub.w #128,d2
  3476.  sub.w #128,d3
  3477.  
  3478.  move.w d2,d4
  3479.  move.w d3,d5
  3480.  muls ACOS,d2
  3481.  muls ASIN,d3
  3482.  sub.l d3,d2
  3483.  muls ASIN,d4
  3484.  muls ACOS,d5
  3485.  add.l d5,d4
  3486.  asl.l #2,d2
  3487.  swap d2
  3488.  asl.l #2,d4
  3489.  swap d4
  3490.  
  3491.  add.w #128,d2
  3492.  add.w #128,d4
  3493.  move.w d2,FSX
  3494.  move.w d4,FSY
  3495.  
  3496.  moveq #0,d2
  3497.  moveq #0,d3
  3498.  move.b (a2,d1.w*4),d2
  3499.  move.b 1(a2,d1.w*4),d3
  3500.  sub.w #128,d2
  3501.  sub.w #128,d3
  3502.  
  3503.  move.w d2,d4
  3504.  move.w d3,d5
  3505.  muls ACOS,d2
  3506.  muls ASIN,d3
  3507.  sub.l d3,d2
  3508.  muls ASIN,d4
  3509.  muls ACOS,d5
  3510.  add.l d5,d4
  3511.  asl.l #2,d2
  3512.  swap d2
  3513.  asl.l #2,d4
  3514.  swap d4
  3515.  
  3516.  add.w #128,d2
  3517.  add.w #128,d4
  3518.  move.w d2,SSX
  3519.  move.w d4,SSY
  3520.  
  3521.  
  3522.  move.w 2(a2,d0.w*4),d2
  3523.  move.w 2(a2,d1.w*4),d3
  3524.  
  3525.  asr.w #4,d2
  3526.  asr.w #4,d3
  3527.  
  3528.  bra .bothtowards
  3529.  
  3530.  tst.w d2
  3531.  blt .firsttowards
  3532.  bgt.s .firstaway
  3533.  
  3534.  tst.w d3
  3535.  ble .bothtowards
  3536.  bra .bothaway
  3537.  
  3538. .firstaway
  3539.  tst.w d3
  3540.  blt .sectowards
  3541.  bra .bothaway
  3542.  
  3543. .firsttowards:
  3544.  tst.w d3
  3545.  ble .bothtowards
  3546.  
  3547. ; First one is towards, the second away.
  3548. ; Do the line in two bits: one heading
  3549. ; from the first point to the rim, the
  3550. ; other heading from the rim to the second
  3551. ; point and flagged as behind.
  3552.  
  3553.  move.w d6,d7    ; total length to draw
  3554.  move.w d2,FIRSTY
  3555.  move.w d3,LASTY
  3556.  
  3557.  neg.w d2
  3558.  add.w d2,d3     ; total change in Y
  3559.  
  3560.  bra.s .onetowards
  3561.  
  3562. .sectowards:
  3563.  move.w d6,d7    ; total length to draw
  3564.  move.w d2,FIRSTY
  3565.  move.w d3,LASTY
  3566.  neg.w d3
  3567.  add.w d2,d3
  3568.  
  3569. .onetowards:
  3570.  
  3571.  muls d2,d6
  3572.  divs d3,d6    ; length of first bit of line.
  3573.  
  3574.  ext.l d6
  3575.  ext.l d7
  3576.  
  3577.  move.w d6,FIRSTLEN
  3578.  sub.l d6,d7
  3579.  move.w d7,LASTLEN
  3580.  
  3581.  add.l d7,d6
  3582.  
  3583.  move.w FIRSTY,d2
  3584.  move.w LASTY,d3
  3585.  swap d2
  3586.  clr.w d2
  3587.  swap d3
  3588.  clr.w d3
  3589.  sub.l d2,d3
  3590.  divs.l d6,d3
  3591.  move.l d3,a6
  3592.  move.l d2,d7
  3593.  
  3594.  moveq #0,d2
  3595.  moveq #0,d3
  3596.  moveq #0,d4
  3597.  moveq #0,d5
  3598.  move.b (a2,d0.w*4),d2
  3599.  move.b 1(a2,d0.w*4),d3
  3600.  
  3601.  move.w d2,FIRSTU
  3602.  move.w d3,FIRSTV
  3603.  
  3604.  move.w d2,d4
  3605.  move.w d3,d5
  3606.  sub.w #128,d2
  3607.  sub.w #128,d3
  3608.  muls d2,d2
  3609.  muls d3,d3
  3610.  add.l d3,d2
  3611.  jsr CALCSQROOT
  3612.  
  3613.  tst.w d2
  3614.  beq.s .nochng
  3615.  
  3616.  sub.w #128,d4
  3617.  sub.w #128,d5
  3618.  muls #127,d4
  3619.  muls #127,d5
  3620.  divs d2,d4
  3621.  divs d2,d5
  3622.  add.w #128,d4
  3623.  add.w #128,d5
  3624.  
  3625. .nochng:
  3626.  
  3627.  move.w d4,MIDU
  3628.  move.w d5,MIDV
  3629.  
  3630.  move.b (a2,d1.w*4),d4
  3631.  move.b 1(a2,d1.w*4),d5
  3632.  move.w d4,SECU
  3633.  move.w d5,SECV
  3634.  
  3635. ; move.w d4,d2
  3636. ; move.w d5,d3
  3637. ;
  3638. ; sub.w #128,d2
  3639. ; sub.w #128,d3
  3640. ; muls d2,d2
  3641. ; muls d3,d3
  3642. ; add.l d3,d2
  3643. ; jsr CALCSQROOT
  3644. ;
  3645. ; tst.w d2
  3646. ; beq.s .nochng2
  3647. ;
  3648. ; sub.w #128,d4
  3649. ; sub.w #128,d5
  3650. ; muls #127,d4
  3651. ; muls #127,d5
  3652. ; divs d2,d4
  3653. ; divs d2,d5
  3654. ; add.w #128,d4
  3655. ; add.w #128,d5
  3656. ;.nochng2:
  3657. ;
  3658. ; add.w MIDU,d4
  3659. ; add.w MIDV,d5
  3660. ; asr.w #1,d4
  3661. ; asr.w #1,d5
  3662. ; move.w d4,MIDU
  3663. ; move.w d4,MIDV
  3664.  
  3665.  move.l #NORMBRIGHTS,a2
  3666.  move.w (a2,d0.w*2),d0
  3667.  move.w (a2,d1.w*2),d1
  3668.  
  3669.  sub.w d0,d1
  3670.  swap d1
  3671.  swap d0
  3672.  divs.l d6,d1
  3673.  
  3674.  move.w FIRSTLEN,d6
  3675.  beq.s .nofirstbit
  3676.  ext.l d6
  3677.  
  3678.  moveq #0,d2
  3679.  moveq #0,d3
  3680.  moveq #0,d4
  3681.  moveq #0,d5
  3682.  move.w FIRSTU,d2
  3683.  move.w MIDU,d3
  3684.  move.w FIRSTV,d4
  3685.  move.w MIDV,d5
  3686.  
  3687.  sub.w d2,d3
  3688.  swap d2
  3689.  swap d3
  3690.  divs.l d6,d3
  3691.  move.l d3,a4
  3692.  
  3693.  sub.w d4,d5
  3694.  swap d4
  3695.  swap d5
  3696.  divs.l d6,d5
  3697.  move.l d5,a5
  3698.  
  3699.  bsr DOABITOFLINE
  3700. .nofirstbit:
  3701.  
  3702.  move.w LASTLEN,d6
  3703.  beq.s .nosecbit
  3704.  ext.l d6
  3705.  
  3706.  moveq #0,d2
  3707.  moveq #0,d3
  3708.  moveq #0,d4
  3709.  moveq #0,d5
  3710.  move.w MIDU,d2
  3711.  move.w SECU,d3
  3712.  move.w MIDV,d4
  3713.  move.w SECV,d5
  3714.  
  3715.  sub.w d2,d3
  3716.  swap d2
  3717.  swap d3
  3718.  divs.l d6,d3
  3719.  move.l d3,a4
  3720.  
  3721.  sub.w d4,d5
  3722.  swap d4
  3723.  swap d5
  3724.  divs.l d6,d5
  3725.  move.l d5,a5
  3726.  
  3727.  bsr DOABITOFLINE
  3728. .nosecbit:
  3729.  
  3730.  bra .noline
  3731.  
  3732. .bothaway
  3733.  
  3734. ; Both are away, so do it simply.
  3735.  
  3736. .bothtowards:
  3737.  
  3738. ; Both are towards, so do it simply and flag all
  3739. ; points as towards.
  3740.  
  3741.  swap d2
  3742.  clr.w d2
  3743.  swap d3
  3744.  clr.w d3
  3745.  sub.l d2,d3
  3746.  divs.l d6,d3
  3747.  move.l d3,a6
  3748.  move.l d2,d7
  3749.  
  3750.  moveq #0,d2
  3751.  moveq #0,d3
  3752.  moveq #0,d4
  3753.  moveq #0,d5
  3754. ; move.b (a2,d0.w*4),d2
  3755. ; move.b (a2,d1.w*4),d3
  3756. ; move.b 1(a2,d0.w*4),d4
  3757. ; move.b 1(a2,d1.w*4),d5
  3758.  
  3759.  move.w FSX,d2
  3760.  move.w SSX,d3
  3761.  move.w FSY,d4
  3762.  move.w SSY,d5
  3763.  
  3764.  sub.w d2,d3
  3765.  swap d2
  3766.  swap d3
  3767.  divs.l d6,d3
  3768.  move.l d3,a4
  3769.  
  3770.  sub.w d4,d5
  3771.  swap d4
  3772.  swap d5
  3773.  divs.l d6,d5
  3774.  move.l d5,a5
  3775.  
  3776.  move.l #NORMBRIGHTS,a2
  3777.  move.w (a2,d0.w*2),d0
  3778.  move.w (a2,d1.w*2),d1
  3779.  
  3780.  sub.w d0,d1
  3781.  swap d1
  3782.  swap d0
  3783.  divs.l d6,d1
  3784.  
  3785.  bsr DOABITOFLINE
  3786.  
  3787. .noline:
  3788.  rts
  3789.  
  3790.  DOABITOFLINE:
  3791.  subq #1,d6
  3792.  
  3793. .STICKINGOUR:
  3794.  swap d7
  3795.  move.b d7,2(a3)
  3796.  swap d7
  3797.  add.l a6,d7
  3798.  swap d0
  3799.  move.w d0,4(a3)
  3800.  swap d0
  3801.  add.l d1,d0
  3802.  swap d2
  3803.  move.b d2,8(a3)
  3804.  swap d4
  3805.  move.b d4,9(a3)
  3806.  swap d4
  3807.  adda.w #16,a3
  3808.  swap d2
  3809.  add.l a4,d2
  3810.  add.l a5,d4
  3811.  dbra d6,.STICKINGOUR
  3812.  
  3813.  rts
  3814.  
  3815. FIRSTY: dc.w 0
  3816. LASTY: dc.w 0
  3817. FIRSTU: dc.w 0
  3818. SECU: dc.w 0
  3819. FIRSTV: dc.w 0
  3820. SECV: dc.w 0
  3821.     dc.w 0
  3822. FIRSTLEN: dc.w 0
  3823.     dc.w 0
  3824. LASTLEN: dc.w 0
  3825. MIDU: dc.w 0
  3826. MIDV: dc.w 0
  3827.  
  3828. *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  3829.  
  3830.  
  3831.  
  3832. ************************************************
  3833. ************************************************
  3834. ************************************************
  3835. ************************************************
  3836. ************************************************
  3837. ************************************************
  3838. ************************************************
  3839. ************************************************
  3840. ************************************************
  3841. ************************************************
  3842. ************************************************
  3843. ************************************************
  3844. ************************************************
  3845. ************************************************
  3846. ************************************************
  3847. ************************************************
  3848. ************************************************
  3849.  
  3850.  move.w d3,TOPLINE
  3851.  move.w d4,BOTLINE
  3852.  
  3853.  
  3854.  
  3855.  
  3856. *********************************************
  3857.  
  3858. CALCSQROOT:
  3859.  tst.l d2
  3860.  beq .oksqr
  3861.  
  3862.  movem.l d0/d1/d3-d7/a0-a6,-(a7)
  3863.  
  3864.  move.w #31,d0
  3865. .findhigh
  3866.  btst d0,d2
  3867.  bne .foundhigh
  3868.  dbra d0,.findhigh
  3869. .foundhigh
  3870.  asr.w #1,d0
  3871.  clr.l d3
  3872.  bset d0,d3
  3873.  move.l d3,d0
  3874.  
  3875.  move.w d0,d1
  3876.  muls d1,d1    ; x*x
  3877.  sub.l d2,d1    ; x*x-a
  3878.  asr.l #1,d1    ; (x*x-a)/2
  3879.  divs d0,d1    ; (x*x-a)/2x
  3880.  sub.w d1,d0    ; second approx
  3881.  bgt .stillnot0
  3882.  move.w #1,d0
  3883. .stillnot0
  3884.  
  3885.  move.w d0,d1
  3886.  muls d1,d1
  3887.  sub.l d2,d1
  3888.  asr.l #1,d1
  3889.  divs d0,d1
  3890.  sub.w d1,d0    ; second approx
  3891.  bgt .stillnot02
  3892.  move.w #1,d0
  3893. .stillnot02
  3894.  
  3895.  move.w d0,d1
  3896.  muls d1,d1
  3897.  sub.l d2,d1
  3898.  asr.l #1,d1
  3899.  divs d0,d1
  3900.  sub.w d1,d0    ; second approx
  3901.  bgt .stillnot03
  3902.  move.w #1,d0
  3903. .stillnot03
  3904.  
  3905.  move.w d0,d2
  3906.  ext.l d2
  3907.  
  3908.  movem.l (a7)+,d0/d1/d3-d7/a0-a6
  3909.  
  3910. .oksqr
  3911.  rts
  3912.  
  3913.  
  3914. **********************************************
  3915. **********************************************
  3916. **********************************************
  3917. **********************************************
  3918. **********************************************
  3919. **********************    ************************
  3920. **********************************************
  3921. **********************************************
  3922. **********************************************
  3923. **********************************************
  3924. **********************************************
  3925. **********************************************
  3926. **********************************************
  3927. **********************************************
  3928. **********************************************
  3929. **********************************************
  3930. **********************************************
  3931. **********************************************
  3932. **********************************************
  3933.  
  3934. TOPLINE: dc.w 0
  3935. BOTLINE: dc.w 0
  3936.  
  3937.  
  3938.  
  3939. **********************************************
  3940. **********************************************
  3941. **********************************************
  3942. **********************************************
  3943. **********************************************
  3944. **********************************************
  3945. **********************************************
  3946. **********************************************
  3947. **********************************************
  3948. **********************************************
  3949. **********************************************
  3950. **********************************************
  3951. **********************************************
  3952. **********************************************
  3953. **********************************************
  3954. **********************************************
  3955. **********************************************
  3956. **********************************************
  3957. **********************************************
  3958.     
  3959.  
  3960.     
  3961.  dc.w 0
  3962. YDIFF: dc.w 0
  3963.  
  3964. SPINAROUND: dc.w 0    
  3965. XCOS: dc.w 0
  3966. YCOS: dc.w 0
  3967. XSIN: dc.w 0
  3968. YSIN: dc.w 0
  3969. XCOS3: dc.w 0
  3970. YCOS3: dc.w 0
  3971. XSIN3: dc.w 0
  3972. YSIN3: dc.w 0
  3973. XCOS2: dc.w 0
  3974. YCOS2: dc.w 0
  3975. XSIN2: dc.w 0
  3976. YSIN2: dc.w 0
  3977. XADD: dc.l 0
  3978. YADD: dc.l 0
  3979. ZADD: dc.l 0
  3980. XOFF: dc.w 0
  3981. YOFF: dc.w 0
  3982. OLDXM: dc.w 0
  3983. OLDYM: dc.w 0
  3984.  
  3985.  
  3986.  
  3987. TEXTUREADD: dc.w 0
  3988.  
  3989.  
  3990. **********************************************************
  3991.  
  3992. UVCOORDS: ds.l 250
  3993. ROTATEDPTS: ds.l 250*4
  3994. SHADOWPTS: ds.l 250*4
  3995. ONSCREENPTS: ds.l 250
  3996.  
  3997. ZOFF: dc.w 768
  3998.  
  3999. LEFTRIGHT: ds.l 256
  4000.  
  4001. POLYGONDATA:
  4002.  ds.b 30000
  4003.  
  4004. OBJNAME: dc.b "ab3:vectobj/testcube",0
  4005.  even
  4006. doslibname: dc.b 'dos.library',0
  4007.  even
  4008. doslib: dc.l 0
  4009.  
  4010. ****************************
  4011.  
  4012. SINETABLE:
  4013.  incbin "ab3:includes/bigsine"
  4014.  
  4015.  
  4016. YANG: dc.w 0
  4017. XANG: dc.w 0
  4018.  
  4019.  
  4020. xmouse: dc.w 0
  4021. ymouse: dc.w 0
  4022.  
  4023. spleen: dc.w 0
  4024. lastspleen: dc.w 0
  4025.  
  4026. COPIEDPAL:
  4027.  dc.w 256,0
  4028.  ds.l 3*256
  4029.  ds.l 10
  4030.  
  4031. SHADOWBUFFER:
  4032. HIGHLIGHT: incbin "work:temp/HIGHLIGHT"
  4033.  
  4034. PALETTEBIT:
  4035. ; incbin "256palette"
  4036. ; dc.w $ffff,$fffe
  4037.  
  4038.  incbin "ab3:shadowtex/shadowpal"
  4039.  
  4040.  include "ab3:source_4000/chunky.s"
  4041.  
  4042. willy: ds.w 48
  4043.  
  4044.  
  4045. PALS:
  4046.  ds.l 2*49
  4047.  
  4048. pregour: dc.b 0
  4049. Gouraud: dc.b 0
  4050.  
  4051. PointAngPtr: dc.l 0
  4052. FRAMENUM: dc.w 0
  4053. PolyAngPtr: dc.l 0
  4054. PtsPtr: dc.l 0
  4055. LinesPtr: dc.l 0
  4056. POINTER_TO_POINTERS: dc.l 0
  4057. FRAME: dc.w 4
  4058. FLIBBLE: dc.w 0
  4059. START_OF_OBJECT: dc.l 0
  4060. num_points: dc.w 0
  4061. num_frames: dc.w 0
  4062. SORTIT: dc.w 0
  4063. PartBuffer: ds.l 2*32
  4064. endparttab:
  4065.  
  4066. x1: dc.w 0
  4067. y1: dc.w 0
  4068. z1: dc.w 0
  4069. x2: dc.w 0
  4070. y2: dc.w 0
  4071. z2: dc.w 0
  4072. x2b: dc.w 0
  4073. y2b: dc.w 0
  4074. z2b: dc.w 0
  4075.  
  4076. x3: dc.w 0
  4077. y3: dc.w 0
  4078. z3: dc.w 0
  4079.  
  4080. l1: dc.w 0
  4081. l2: dc.w 0
  4082.  
  4083. OBJONOFF: dc.l 0
  4084.  
  4085. SAVEHIGHS: ds.w 30
  4086.  
  4087. FASTBUFFER:
  4088.  dc.l fasty
  4089.  
  4090. fasty: ds.b 320*256
  4091.  
  4092. NORMBRIGHTS: ds.w 250
  4093.  
  4094. SPECBRIGHTS:
  4095.  dcb.l 100,31
  4096.  
  4097. ENDNORM:
  4098.  
  4099. LEFTUVS: ds.w 8*256
  4100. RIGHTUVS: ds.w 8*256
  4101.  
  4102. NORMVECTS: ds.w 3*250
  4103.  
  4104. ;WORLD: incbin "ab3:includes/world"
  4105.  
  4106. ;TWEEN: incbin "ab3:includes/tweenbrightfile"
  4107.  
  4108.  
  4109.  
  4110. NEBBIE: incbin "work:temp/nebbieroar"
  4111.     ds.l (192/4)*16
  4112.  
  4113.  SECTION blib,code_f
  4114.  
  4115. TEXTURES:
  4116.  incbin "ab3:shadowtex/shadowmaps"
  4117.  even
  4118.  
  4119.  SECTION BGDROP,code_c
  4120.  
  4121. RAWSCRN:
  4122.  ds.l 2560*8
  4123.